丹尼大叔

数学专业毕业,爱上编程的大叔,兴趣广泛。使用博客园这个平台分享我工作和业余的学习内容,以编程交友。有朋自远方来,不亦乐乎。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

摘要

这篇文章介绍怎样将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方法得到需要的类型对象。

 

posted on 2016-08-04 21:43  丹尼大叔  阅读(1901)  评论(0编辑  收藏  举报