Ninject之旅之二:开始使用Ninject

摘要

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

时间: 2024-10-07 13:10:41

Ninject之旅之二:开始使用Ninject的相关文章

Ninject之旅之七:Ninject依赖注入

摘要 可以使用不同的模式向消费者类注入依赖项,向构造器里注入依赖项是期中一种.有一些遵循的模式用来注册依赖项,同时有一些需要避免的模式,因为他们经常导致不合乎需要的结果.这篇文章讲述那些跟Ninject功能相关的模式和反模式.然而,全面的介绍可以在Mark Seemann的书<Dependency Injection in .NET>中找到. 1.构造函数注入 构造函数时推荐的最常用的向一个类注册依赖项的模式.一般来说,这种模式应该经常被用作主要的注册模式,除非我们不得不使用其他的模式.在这个

前端编程提高之旅(二)----网站常见特效的jquery实现

最好的编程语言是逻辑,前端各种交互特效的实现多可以用jquery实现,特效可以纷飞,内在逻辑则基本不变.这一篇文章主要介绍jquery实现常见特效背后的逻辑.    1.通过类名获取元素集合    首先来看一个js原生代码不支持的方法,通过类来获取元素集合. document.getElementsByClassName=function(classname){ var retnode = []; var myclass = new RegExp('\\b'+classname+'\\b');/

JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中,也是能看到他的,所以还是非常值得去学习的一个知识点的,我们直接开车了 一.Map概述 泛型< k,v> 键值对,映射关系 基本特点 该集合存储键值对,是一对一对往里存,而且要保证键的唯一性 1.添加 put(key ,values) putAll() 2.删除 clear() remove(ob

Ajax之旅(二)--XMLHttpRequest

上文中提到的Ajax的异步更新,主要使用XMLHttpRequest对象来实现的,XMLHttpRequest对象可以在不向服务器提交整个页面的情况下,实现局部更新网页.当页面全部加载完毕后,客户端通过该对象向服务器请求数据,服务器端接受数据并处理后,向客户端反馈数据. 关于XMLHttpRequest对象方法和属性如下(聊一眼即可,不是本文重点): <html> <head> <title>XMLHTTPRequest对象的说明DEMO</title> &

JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Fiald,Method,反射Main方法,数组的反射和实践

JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Fiald,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识Class类 想要反射,你就必须要了解一个类--Class,我们知道,java程序中的各个java类都属于同一事物,我们通常用Classliability描述对吧,反射这个概念从JDK1.2就出来了,历史算是比较悠久了,这个Class可不是关键字哦,这个是一个类,他代表的是一类事物: 我们归根结底就

webpack入坑之旅(二)loader入门

这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack 在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不是开始的开始 webpack入坑之旅(二)loader入门 webpack入坑之旅(三)webpack.config入门 webpack入坑之旅(四)扬帆起航 webpack入坑之旅(五)加载vue单文件组件 webpack入坑之旅(六)配合vue-router实现SPA 引子 在上一篇博客中我们已

我的shiro之旅: 十二 shiro 踢出用户(同一用户只能一处登录)

我的shiro之旅: 十二 shiro 踢出用户(同一用户只能一处登录) 2014年09月05日 ⁄ 综合 ⁄ 共 4677字 ⁄ 字号 小 中 大 ⁄ 评论关闭 看了一下官网,没有找到关于如何控制同一用户只能一处登录的介绍,网上也没有找到相关的文章.可能有些人会记录用户的登录信息,然后达到踢出用户的效果.这里介绍一个更简单的方法. 如果我们跟shiro的源码,我们可以看到.当用户登录成功 后,shiro会把用户名放到session的attribute中,key为 DefaultSubjectC

我的Spring之旅(二):为请求添加参数

1.前言 在上一篇我的Spring之旅(一)中,我们只是利用不带参数的请求返回一个网页或一段json,在实际的B/S.C/S网络交互中,请求中需要自定义的参数.本篇将简单地为之前的请求添加参数. 2.参数说明 ①method:API名称,用于区分服务端调用方法 ②name:请求参数名称,将作为method方法的实参 3.改写HelloController.java package com.nextgame.web; import java.io.IOException; import net.s

JAVA之旅(二十三)——System,RunTime,Date,Calendar,Math的数学运算

JAVA之旅(二十三)--System,RunTime,Date,Calendar,Math的数学运算 map实在是太难写了,整理得我都晕都转向了,以后看来需要开一个专题来讲这个了,现在我们来时来学习一些新的小东西吧 一.System 翻译过来系统的意思,系统类,里面的方法都是静态的,可以直接调用 我们来演示一下吧,先从获取系统信息开始: package com.lgl.hellojava; import java.util.Properties; public class HelloJJAVA