zoukankan      html  css  js  c++  java
  • 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方法得到需要的类型对象。

  • 相关阅读:
    2月2日学习记录
    Python爬虫学习(三)使用Scrapy库
    2月1日学习记录
    Python爬虫学习(二)使用re库
    Python爬虫学习(二)使用Beautiful Soup库
    Python爬虫学习(一)使用requests库和robots协议
    spark学习(五)RDD
    body内常用标签--form表单
    body内常用标签
    HTTP协议
  • 原文地址:https://www.cnblogs.com/uncle_danny/p/5738518.html
Copyright © 2011-2022 走看看