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

1.      依赖注入和IOC

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

2.      环境准备

?  开发环境:WIN7 + VS2010 SP1

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

3.简单的例子

?  需求描述:

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

?  步骤:

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方法来获得相应的实现。

http://bobowg.blog.163.com/blog/static/2655391720126267139691/

C#Console程序使用Ninject的更多相关文章

  1. 使用powershell监控命令行console程序并在停止时启动

    有一种C#命令行console程序,为了能看到console台的输出所以不能做成服务.为了防止这些程序自己死掉,使用powershell监控程序并重启 #利用程序名来进行重启if (!(get-pro ...

  2. Console 程序在任务计划程序无法读写文件

    当我们把Console 程序作为Window计划任务的计划任务的操作的时候,我们明明设置了程序的执行权限或者文件夹的读写权限(尝试了所有权限,各种账号读写权限的切换都不好使),但是当我们有读写操作的时 ...

  3. ASP.NET Core:CMD命令行+记事本 创建Console程序和Web Application

    今天看了Scott关于ASP.NET Core的介绍视频,发现用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运 ...

  4. 编译Console程序时,可以指定Main入口函数

    有如下简单的console程序 using System; namespace HelloWorld { class Program { static void Main(string[] args) ...

  5. Delph控制台(Console)程序添加图标和版权信息

    Delphi创建控制台(Console)程序默认是无法添加图标和版权的.经过仔细的对比窗体程序与控制台程序源码,发现窗体程序的工程文中,在uses结束begin开始的地方有一句如下代码:{$R *.r ...

  6. console 程序随系统启动及隐藏当前程序窗口

    应业务需求,程序需要与系统启动而自动运行,故加入以下代码,保存成 .bat文件 ,双击执行即可 reg add "HKEY_CURRENT_USER\Software\Microsoft\W ...

  7. DotNet Core Console 程序使用NLog

    参考:https://github.com/NLog/NLog/wiki/Tutorial 步骤: 1. 使用Nuget安装NLog.Extensions.Logging Install-Packag ...

  8. Console程序下监控EFCore生成的SQL语句!

    最近这两天在使用控制台程序学习EFCore,突然想看看生成的SQL语句,所以在网上找到一位大神的分享的方法! 准备工作: 1). MySqlEFCore NuGet:   Pomelo.EntityF ...

  9. Ubuntu系统下的第一个console程序

    进入自己喜欢的目录,前面步骤和windows基本一致,只简单描述下 执行 dotnet new 然后执行 dotnet restore 然后执行 dotnet run 第一次未编译,会自动编译,然后可 ...

随机推荐

  1. Linux经常使用的命令(必看)

    http://www.importnew.com/12425.html     http://www.importnew.com/13107.html http://www.importnew.com ...

  2. jsp 行动标签

    jsp行动标签 签.它影响JSP执行时的功能. 1.include动作标签 <jsp:include page="文件名称字"/> 或 <jsp:include  ...

  3. 新秀发挥云17号:RHEL改变以太网地址克隆虚拟机后,

    新秀发挥云17号:RHEL改变以太网地址克隆虚拟机后, (一)变化hostname # vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=your-v ...

  4. Oracle 使用

    Oracle 日志文件 摘要: 本篇博文呢主要是介绍 Oracle 日志文件的管理, 对 Oracle 日志文件呢,有两个比较关键的名词, 即日志文件组 LogFileGroup 和日志文件 LogF ...

  5. Java和Flex积分误差(一个)

    1.错误叙述性说明 at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency( ...

  6. 浅谈JavaScript中继承的实现

    谈到js中的面向对象编程,都有一个共同点,选择原型属性还是构造函数,两者各有利弊,而就片面的从js的对象创建以及继承的实现两个方面来说,官方所推荐的是两个相结合,各尽其责,各取其长,在前面的例子中,我 ...

  7. linux_cp_远程copy

    1:远程copy  [linux对linux 远程拷贝]   scp 文件名  root@远程ip:/路径/    将本地home目录下的test.tar的文件拷贝到远程主机192.168.1.23的 ...

  8. 关于Java的对象、数组、String类的具体用法

    对象的行为: 1.内存分配(栈和堆的区别) 栈:保存局部变量的值(用来保存基本数据类型的值:保存类的实例的引用) 对:用来存放动态产生的数据,比如new出来的对象 2.调用方法 方法返回一个值.方法不 ...

  9. 如何从 0 开始学 Ruby on Rails

    如何从 0 开始学 Ruby on Rails (漫步版)Ruby 是一门编程语言,Ruby on Rails 是 Ruby 的一个 web 框架,简称 Rails. 有很多人对 Rails 感兴趣, ...

  10. 详细的图文介绍如何利用XAMPP本地建站的环境配置教程

    原文:详细的图文介绍如何利用XAMPP本地建站的环境配置教程 WordPress 是一个简便快捷,用途广,人气旺的一个开源的博客建站程序.很有很多等您去发现. 简便快捷:在性能上易于操作.易于浏览: ...