Ninject之旅之二:開始使用Ninject(附程序下載)


摘要

這篇文章介紹怎樣將Ninject添加到實際的項目中,使用Ninject框架最基本的功能。首先用一個Hello World例子介紹怎么添加和使用Ninject。然后用一個更復雜的例子,介紹Ninject DI容器是怎樣管理依賴的。

下載Demo程序

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方法得到需要的類型對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM