摘要
这篇文章介绍怎样将Ninject添加到实际的项目中,使用Ninject框架最基本的功能。首先用一个Hello World例子介绍怎么添加和使用Ninject。然后用一个更复杂的例子,介绍Ninject DI容器是怎样管理依赖的。
1、第一个Ninject程序:Hello World
1)创建控制台应用程序Demo.Ninject。
2)使用NuGet Manager向工程添加Ninject。
3)添加SalutationService类。
using System; namespace Demo.Ninject
{
public class SalutationService
{
public void SayHello()
{
Console.WriteLine("Hello Ninject!");
}
}
}
4)修改Program.cs文件。
using Ninject;
using System; namespace Demo.Ninject
{
class Program
{
static void Main(string[] args)
{
using (var kernel = new StandardKernel())
{
var service = kernel.Get<SalutationService>();
service.SayHello();
Console.ReadLine();
}
}
}
}
- var kernel = new StandardKernel()是使用Ninject框架的第一步,生成StandardKernel实例,一个Kernel DI容器。
- 通过kernel.Get方法,传入类型作为泛型参数,将调用类的构造函数,得到类型实例。注意这里没有直接使用new关键字调用构造函数。而是由Ninject框架来间接调用类的构造函数。
运行程序,得到结果。
2、一个更复杂的例子:类型绑定
1)在工程中添加引用System.Configuration。修改App.config文件。SenderEmail和SenderPassword请填写自己的邮箱账号和密码。
2)添加类MailServerConfig,用来读取App.config内的信息。
using System;
using System.Configuration; namespace Demo.Ninject
{
public class MailServerConfig
{
public string SmtpServer
{
get
{
return ConfigurationManager.AppSettings["SmtpServer"];
}
}
public int SmtpPort
{
get
{
var port = ConfigurationManager.AppSettings["SmtpPort"];
return Convert.ToInt32(port);
}
}
public string SenderEmail
{
get
{
return ConfigurationManager.AppSettings["SenderEmail"];
}
}
public string SenderPassword
{
get
{
return ConfigurationManager.AppSettings["SenderPassword"];
}
}
}
}
3)添加MailService.cs文件,向里面添加ILogger接口、ConsoleLogger类、EventLogger类和MailService类。
using System;
using System.Net;
using System.Net.Mail; namespace Demo.Ninject
{
public interface ILogger
{
void Log(string message);
} class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine("{0}: {1}", DateTime.Now, message);
}
} class EventLogger : ILogger
{
public void Log(string message)
{
System.Diagnostics.EventLog.WriteEntry("MailService", message);
}
} public class MailService
{
private ILogger logger;
private SmtpClient client;
private string sender; public MailService(MailServerConfig config, ILogger logger)
{
this.logger = logger;
InitializeClient(config);
sender = config.SenderEmail;
} public void SendMail(string address, string subject, string body)
{
logger.Log("Initializing...");
var mail = new MailMessage(sender, address);
mail.Subject = subject;
mail.Body = body;
logger.Log("Sending message...");
client.Send(mail);
logger.Log("Message sent successfully.");
} private void InitializeClient(MailServerConfig config)
{
client = new SmtpClient();
client.Host = config.SmtpServer;
client.Port = config.SmtpPort;
client.EnableSsl = true;
var credentials = new NetworkCredential();
credentials.UserName = config.SenderEmail;
credentials.Password = config.SenderPassword;
client.Credentials = credentials;
}
}
}
- ILogger接口、ConsoleLogger类、EventLogger类在上一篇文章的代码里已经使用过了,这里保持不变。
- MailService数据成员添加了client: SmtpClient成员用来保存发送邮件的SmtpClient对象。sender: string成员保存邮件发送者账号。
- MailService构造函数添加了MailServerConfig config参数。
- InitializeClient(MailServerConfig config)函数用来根据MailServerConfig对象生成SmtpClient对象。
4)修改Pragram.cs文件。
using Ninject;
using System; namespace Demo.Ninject
{
class Program
{
static void Main(string[] args)
{
using (var kernel = new StandardKernel())
{
var service = kernel.Get<SalutationService>();
service.SayHello(); kernel.Bind<ILogger>().To<ConsoleLogger>();
var mailService = kernel.Get<MailService>();
mailService.SendMail("someone@domain.com", "test email", "it is a test Email");
Console.ReadLine();
}
}
}
}
kernel.Bind<ILogger>().To<ConsoleLogger>();用来将接口ILogger绑定到具体类ConsoleLogger,给Ninject DI容器添加依赖映射表。Ninject DI容器在此后看到ILogger接口,则使用ConsoleLogger类实例化对象。
var mailService = kernel.Get<MailService>();用来生成MailService类实例。MailService类构造函数有两个参数,依赖两个类MailServerConfig和ILogger,如下图。
Ninject将自动调用构造函数生成MailServerConfig对象和ILogger对象(ConsoleLogger对象),然后将这两个对象作为构造函数参数,生成MailService对象。这个过程对程序员是透明的。
将上面的“someone@domain.com”改成实际使用的邮箱账号,执行程序,得到结果。成功发送电子邮件。
结语
在项目中使用Ninject非常容易,只需要四个步骤:1、需要添加Ninject引用。2、生成StandardKernel对象。3、使用一系列的Bind方法添加依赖映射表。4、调用Get方法得到需要的类型对象。