Ninject 2.x细说---1.基本使用
Ninject 2.x细说---1.基本使用
本来想使用一下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.基本使用的更多相关文章
- Ninject 2.x细说---2.绑定和作用域
Ninject 2.x细说---2.绑定和作用域 转载weixin_33725272 最后发布于2011-11-06 00:03:00 阅读数 9 收藏 Ninject中提供多种接口和实现类的绑 ...
- [1] Ninject
为什么使用这种依赖注入的框架呢?我借鉴两张图做一下说明 传统的接口方式,即 IValueCalculator I=new LinqValueCalculator,虽然用接口做的隔离,但是在调用的时候实 ...
- 依赖注入和IOC
http://www.bbsmvc.com/archiver/csharp/thread-831-1.html 本来想使用一下Ninject的,然后搜索了很久,都没找到比较详细的关于Ninject的使 ...
- 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密
0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...
- 细说WebSocket - Node篇
在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...
- 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包
0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...
- 细说 Form (表单)
细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ...
- Ninject学习(一) - Dependency Injection By Hand
大体上是把官网上的翻译下而已. http://www.ninject.90iogjkdcrorg/wiki.html Dependency Injection By Hand So what's Ni ...
随机推荐
- C++->输入输出文件流的相关函数
标准输入输出流与文件输入输出流的关系图: 文件输出流头文件“ofstream/fstream”,文件输入流头文件“ifstream/fstream” 1.1.打开文件方式:流类 对象名(文件名,方式) ...
- 【32】Padding(填充)原理讲解
Padding 为了构建深度神经网络,你需要学会使用的一个基本的卷积操作就是padding,让我们来看看它是如何工作的. 我们在之前笔记中看到,如果你用一个3×3的过滤器卷积一个6×6的图像,你最 ...
- Swaps and Inversions HDU - 6318 树状数组+离散化
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...
- tsocks代理git wget
使用clash时, 命令行的wget和git操作可能没有被代理 安装tsocks: apt-get install tsocks 修改配置文件: vi /etc/tsocks.conf 找到: ser ...
- Wannafly Camp 2020 Day 2B 萨博的方程式 - 数位dp
给定 \(n\) 个数 \(m_i\),求 \((x_1,x_2,...,x_n)\) 的个数,使得 \(x_1 \ xor\ x_2\ xor\ ...\ xor\ x_n = k\),且 \(0 ...
- 看完它,你就全懂了十大Wifi芯片原厂!
看完它,你就全懂了十大Wifi芯片原厂! 来源:全球物联网观察 概要:不知不觉中,WiFi几乎已攻占了整个世界.现在只要你上网,可能就离不开WiFi了. 2014年是物联网WiFi市场关键的转折期 ...
- Windows Live Writer 2012 安装配置
Windows Live Writer 2012用起来比较舒服,可以直接编辑 在线博客文章 下载地址 http://g.live.com/1rewlive5-all/zh-cn/wlsetup-all ...
- Python3标准库:enum枚举
1. enum枚举 枚举是一组符号名称(枚举成员)的集合,枚举成员应该是唯一的.不可变的.在枚举中,可以对成员进行恒等比较,并且枚举本身是可迭代的. 1.1 创建枚举 可以使用class语法派生Enu ...
- app遮罩层--网赚
css .mask{display: none; position: fixed; width: 100%; height: 100%; top:0; background: rgba(0, 0, 0 ...
- gtid环境下mysqldump对于set-gtid-purged的取值
gtid环境备份的时候,还在为set-gtid-purged=0|1的选择而烦恼吗,一起来分析一下. [mysql@lxd-vm1@/home/mysql]$ mysqldump --help | g ...