Ninject 2.x细说---1.基本使用

https://blog.csdn.net/weixin_33809981/article/details/86091159
 

本来想使用一下Ninject的,然后搜索了很久,都没找到比较详细的关于Ninject的使用方法等内容.于是乎干脆自己来写几篇介绍Ninject的内容.

依赖注入和IOC

依赖注入和IOC的概念,可以点击这里看之前的文章.在这里就不多介绍了.

环境准备

  • 开发环境:WIN7 + VS2010 SP1
  • Ninject:本节内容以Ninject2.2.0.0-release-net-4.0为基础进行介绍。可以点击这里打开Ninject的官网进行下载。需要说明的是,CodePlex上虽然也有Ninject项目,但其基本没怎么更新。所以就不要从那里下载了。直接到Ninject其官方网站下载吧。

简单的例子

Ø  需求描述:

系统有任务消息,每个任务消息都有消息号,消息号的产生可以是以配置文件中的基数为基础产生,也可以是根据数据库中的某个字段产生。

Ø  步骤:

1).定义一个消息接口:

public interface IMessage

{

///<summary>

///取得消息号

///</summary>

///<returns></returns>

string GetMsgNumber();

}

2).从配置文件中获取消息号,实现消息接口。代码如下:

public class MessageFile : IMessage

{

public string GetMsgNumber()

{

return "从文件中获取消息号!";

}

}

3).从数据库中获取消息号,实现消息接口。代码如下:

public class MessageDB : IMessage

{

public string GetMsgNumber()

{

return "从数据中读取消息号";

}

}

4).下面就是准备在我们的应用中注册的接口和接口实现了。代码如下:

using Ninject.Modules;

public class MessageModule : NinjectModule

{

public override void Load()

{

//绑定接口并指定接口的实现。

Bind<IMessage>().To<MessageDB>();

}

}

通过代码我们可以看到,我们只需要继承自NinjectModule并重载其Load()方法,在Load()方法中进行绑定接口并指定其具体实现即可。

5).接着,就是具体的使用了,代码如下:

using Ninject;

static void Main(string[] args)

{

using (var kernal = new StandardKernel(new MessageModule()))

{

var msg = kernal.Get<IMessage>();   取得相应的类型实例

var msgNo = msg.GetMsgNumber();

Console.WriteLine(msgNo);

Console.Read();

}

}

运行代码(注意:在运行代码之前,请将项目的Framework选择中4.0版本,否则会“未能解析引用的程序集“Ninject”,因为它对不在当前目标框架“.NETFramework,Version=v4.0,Profile=Client”中的“System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”具有依赖关系“异常出现),最后我们可以看到,控制台打出的消息是:

从数据中读取消息号!

在代码中,我们通过Kernal的Get方法来取得相应的类型实例,在这整个代码过程中,我们只是在Module中绑定了接口和实现,然后在其他地方都是通过接口类型来实现代码的。如何需要换成从配置文件中获取消息号,则只需要修改自定义的Module中的代码即可。毫无疑问,在程序的类型依赖和耦合方面都有很多优点。

4.接下来,介绍使用Ninject进行依赖注入的几种方式。

Ø  构造函数注入

首先,定义使用依赖接口初始化的类,具体如下:

public class MessageCfg

{

private readonly IMessage msg;

///<summary>

///通过接口构造

///</summary>

///<param name="msg"></param>

public MessageCfg(IMessage msg)

{

this.msg = msg;

}

public string GetMsgNumber()

{

return this.msg.GetMsgNumber();

}

}

然后,我们的代码就可以这样写了:

   using (var kernal = new StandardKernel(new MessageModule()))

{

var msg = kernal.Get<IMessage>();

var msgcfg = new MessageCfg(msg);//构造函数注入

Console.WriteLine(msgcfg.GetMsgNumber());

Console.Read();

}

这里,我们可以初始化MessageCfg的时候,只需要使用kernal.Get<IMessage>()获取的类型即可,而不用关心其具体是什么。

Ø  属性注入

首先定义使用属性注入的类,具体如下:

public class MessageCfg

{

//定义接口属性

public IMessage Msg { get; set; }

public MessageCfg() { }

public string GetMsgNumber()

{

return this.Msg.GetMsgNumber();

}

}

具体使用代码如下:

using (var kernal = new StandardKernel(new MessageModule()))

{

//属性注入

var msgcfg = new MessageCfg() { Msg = kernal.Get<IMessage>() };

Console.WriteLine(msgcfg.GetMsgNumber());

Console.Read();

}

其他几种注入都大同小异,使用方式差不多。

最后,我们可以看到使用Ninject的基本步骤很简单。只需要定义接口、实现接口、继承NinjectModule、在其Load()方法中指定相应的绑定接口和接口实现à通过自己的Module的来初始化Kernalà通过Get方法来获得相应的实现。

Ninject 2.x细说---1.基本使用的更多相关文章

  1. Ninject 2.x细说---2.绑定和作用域

    Ninject 2.x细说---2.绑定和作用域 转载weixin_33725272 最后发布于2011-11-06 00:03:00 阅读数 9  收藏   Ninject中提供多种接口和实现类的绑 ...

  2. [1] Ninject

    为什么使用这种依赖注入的框架呢?我借鉴两张图做一下说明 传统的接口方式,即 IValueCalculator I=new LinqValueCalculator,虽然用接口做的隔离,但是在调用的时候实 ...

  3. 依赖注入和IOC

    http://www.bbsmvc.com/archiver/csharp/thread-831-1.html 本来想使用一下Ninject的,然后搜索了很久,都没找到比较详细的关于Ninject的使 ...

  4. 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密

    0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...

  5. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  6. 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包

    0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...

  7. 细说Java主流日志工具库

    概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...

  8. 细说 Form (表单)

    细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ...

  9. Ninject学习(一) - Dependency Injection By Hand

    大体上是把官网上的翻译下而已. http://www.ninject.90iogjkdcrorg/wiki.html Dependency Injection By Hand So what's Ni ...

随机推荐

  1. @RequestBody 和 @RequestParam(“test”) 的区别与联系

    @RequestBody @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的):GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用 ...

  2. SQL Server 2012 下载和安装详细教程

    https://blog.csdn.net/qq_37591637/article/details/93102794 选择图片中的三个,然后点击下载 ,文件内存很大 下载以后,如图所示,双击.exe程 ...

  3. Spring Cloud feign使用okhttp3

    指南 maven <dependency> <groupId>io.github.openfeign</groupId> <artifactId>fei ...

  4. Linux学习笔记:磁盘分区

    本文更新于2019-12-30.操作系统为Debian 8.9 (jessie). 以下假设新磁盘为/dev/sdb,要创建一个分区/dev/sdb1,文件系统类型为xfs.请根据实际情况,自行选择. ...

  5. web端常见测试

    一.登录注册功能 1.页面调转 2.tab键与enter键 3.密码加密显示,是否支持复制粘贴 4.账号密码校验 5.刷新页面,更新验证码 二.界面测试 1.样式.颜色.整体布局风格 2.最大化.最小 ...

  6. js image to base64 摘录

    //传入图片路径,返回base64 //用处,由于在新增时,使用的是base64的格式,为了统一,在编辑时,也将图片转为base64,以便于统一处理 /* 使用: 因为图像处理存在一定的延时,所以通过 ...

  7. [PAT] A1017 Queueing at Bank

    [思路] 1:将所有满足条件的(到来时间点在17点之前的)客户放入结构体中,结构体的长度就是需要服务的客户的个数.结构体按照到达时间排序. 2:wend数组表示某个窗口的结束时间,一开始所有窗口的值都 ...

  8. 0级搭建类011-Oracle Linux 7.x安装(OEL 7.7) 公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  9. jQuery---三组基本动画 show hide

    三组基本动画 show hide //show不传参数,没有动画效果 $("div").show(); //show(speed) //speed:动画的持续时间 可以是毫秒值 还 ...

  10. Java_Day3(下)

    Java learning_Day3(下) 本人学习视频用的是马士兵的,也在这里献上 <链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA> ...