摘要
这篇文章介绍怎样将Ninject添加到实际的项目中,使用Ninject框架最基本的功能。首先用一个Hello World例子介绍怎么添加和使用Ninject。然后用一个更复杂的例子,介绍Ninject DI容器是怎样管理依赖的。
1、第一个Ninject程序:Hello World
1)创建控制台应用程序Demo.Ninject。
2)使用NuGet Manager向工程添加Ninject。
3)添加SalutationService类。
1 using System; 2 3 namespace Demo.Ninject 4 { 5 public class SalutationService 6 { 7 public void SayHello() 8 { 9 Console.WriteLine("Hello Ninject!"); 10 } 11 } 12 }
4)修改Program.cs文件。
1 using Ninject; 2 using System; 3 4 namespace Demo.Ninject 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 using (var kernel = new StandardKernel()) 11 { 12 var service = kernel.Get<SalutationService>(); 13 service.SayHello(); 14 Console.ReadLine(); 15 } 16 } 17 } 18 }
- var kernel = new StandardKernel()是使用Ninject框架的第一步,生成StandardKernel实例,一个Kernel DI容器。
- 通过kernel.Get方法,传入类型作为泛型参数,将调用类的构造函数,得到类型实例。注意这里没有直接使用new关键字调用构造函数。而是由Ninject框架来间接调用类的构造函数。
运行程序,得到结果。
2、一个更复杂的例子:类型绑定
1)在工程中添加引用System.Configuration。修改App.config文件。SenderEmail和SenderPassword请填写自己的邮箱账号和密码。
2)添加类MailServerConfig,用来读取App.config内的信息。
1 using System; 2 using System.Configuration; 3 4 namespace Demo.Ninject 5 { 6 public class MailServerConfig 7 { 8 public string SmtpServer 9 { 10 get 11 { 12 return ConfigurationManager.AppSettings["SmtpServer"]; 13 } 14 } 15 public int SmtpPort 16 { 17 get 18 { 19 var port = ConfigurationManager.AppSettings["SmtpPort"]; 20 return Convert.ToInt32(port); 21 } 22 } 23 public string SenderEmail 24 { 25 get 26 { 27 return ConfigurationManager.AppSettings["SenderEmail"]; 28 } 29 } 30 public string SenderPassword 31 { 32 get 33 { 34 return ConfigurationManager.AppSettings["SenderPassword"]; 35 } 36 } 37 } 38 }
3)添加MailService.cs文件,向里面添加ILogger接口、ConsoleLogger类、EventLogger类和MailService类。
1 using System; 2 using System.Net; 3 using System.Net.Mail; 4 5 namespace Demo.Ninject 6 { 7 public interface ILogger 8 { 9 void Log(string message); 10 } 11 12 13 class ConsoleLogger : ILogger 14 { 15 public void Log(string message) 16 { 17 Console.WriteLine("{0}: {1}", DateTime.Now, message); 18 } 19 } 20 21 class EventLogger : ILogger 22 { 23 public void Log(string message) 24 { 25 System.Diagnostics.EventLog.WriteEntry("MailService", message); 26 } 27 } 28 29 public class MailService 30 { 31 private ILogger logger; 32 private SmtpClient client; 33 private string sender; 34 35 public MailService(MailServerConfig config, ILogger logger) 36 { 37 this.logger = logger; 38 InitializeClient(config); 39 sender = config.SenderEmail; 40 } 41 42 public void SendMail(string address, string subject, string body) 43 { 44 logger.Log("Initializing..."); 45 var mail = new MailMessage(sender, address); 46 mail.Subject = subject; 47 mail.Body = body; 48 logger.Log("Sending message..."); 49 client.Send(mail); 50 logger.Log("Message sent successfully."); 51 } 52 53 private void InitializeClient(MailServerConfig config) 54 { 55 client = new SmtpClient(); 56 client.Host = config.SmtpServer; 57 client.Port = config.SmtpPort; 58 client.EnableSsl = true; 59 var credentials = new NetworkCredential(); 60 credentials.UserName = config.SenderEmail; 61 credentials.Password = config.SenderPassword; 62 client.Credentials = credentials; 63 } 64 } 65 }
- ILogger接口、ConsoleLogger类、EventLogger类在上一篇文章的代码里已经使用过了,这里保持不变。
- MailService数据成员添加了client: SmtpClient成员用来保存发送邮件的SmtpClient对象。sender: string成员保存邮件发送者账号。
- MailService构造函数添加了MailServerConfig config参数。
- InitializeClient(MailServerConfig config)函数用来根据MailServerConfig对象生成SmtpClient对象。
4)修改Pragram.cs文件。
1 using Ninject; 2 using System; 3 4 namespace Demo.Ninject 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 using (var kernel = new StandardKernel()) 11 { 12 var service = kernel.Get<SalutationService>(); 13 service.SayHello(); 14 15 kernel.Bind<ILogger>().To<ConsoleLogger>(); 16 17 var mailService = kernel.Get<MailService>(); 18 mailService.SendMail("[email protected]", "test email", "it is a test Email"); 19 20 Console.ReadLine(); 21 } 22 } 23 } 24 }
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对象。这个过程对程序员是透明的。
将上面的“[email protected]”改成实际使用的邮箱账号,执行程序,得到结果。成功发送电子邮件。
结语
在项目中使用Ninject非常容易,只需要四个步骤:1、需要添加Ninject引用。2、生成StandardKernel对象。3、使用一系列的Bind方法添加依赖映射表。4、调用Get方法得到需要的类型对象。