摘要
這篇文章介紹怎樣將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("someone@domain.com", "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對象。這個過程對程序員是透明的。
將上面的“someone@domain.com”改成實際使用的郵箱賬號,執行程序,得到結果。成功發送電子郵件。
結語
在項目中使用Ninject非常容易,只需要四個步驟:1、需要添加Ninject引用。2、生成StandardKernel對象。3、使用一系列的Bind方法添加依賴映射表。4、調用Get方法得到需要的類型對象。