#region 第二种写法
/// <summary>
/// using(IKernel tKernel=new StandardKernel(new PeoKernelServer()))
/// {
/// ISay tSay= tKernel.Get<ISay>();
/// IPeople tPeople = new PeoEnglish(tSay);
/// tPeople.sayHello();
/// }
/// </summary>
public class PeoKernelServer : NinjectModule
{
public override void Load()
{
Bind<ISay>().To<ChinaSay>();//这个地方用法类似第一种
}
}
#endregion
#region 第一种写法
/// <summary>
/// ISay pSay = PeoKernel.PeoKernelSigle.KernelSingle.Get<ISay>();
/// IPeople pEoChina = new PeoChina(pSay);
/// pEoChina.Name = "陈国岭";
/// pEoChina.sayHello();
/// </summary>
public class PeoKernel
{
protected static PeoKernel _PeoKernel = new PeoKernel();
public static PeoKernel PeoKernelSigle
{
get
{
return _PeoKernel;
}
}
protected Ninject.IKernel _Kernel = null;
public Ninject.IKernel KernelSingle
{
get
{
return _Kernel;
}
}
protected PeoKernel()
{
_Kernel = new StandardKernel();
BindClass();
}
protected void BindClass()
{
#region 简单绑定 //_Kernel.Bind<ISay>().To<ChinaSay>();//1、一般绑定,必须有无参数构造函数
#region 绑定方法
//Ø To:绑定到接口的具体实现。
//Ø ToConstant:绑定到某个常量值。
//Ø ToMethod:绑定到方法。
//Ø ToProvider:绑定到某个自定义的对象创建提供程序。
//Ø ToSelf:自绑定
#endregion
//_Kernel.Bind<ISay>().To<EnglishSay>().WithConstructorArgument(true);//2.构造函数中,参数绑定,可以没有无参数构造函数
#region 参数绑定
// Ø WithConstructorArgument:指定构造函数中相关的参数,还有回调方法的重载。
//Ø WithMetadata:指定相关元数据信息。
//Ø WithParameter:指定相关的自定义参数。这个方法也实现构造函数参数值指定,与WithConstructorArgument类似,如:Bind<IMessage>().To<MessageDB>().WithConstructorArgument("msg", 1);同样可以写成:Bind<IMessage>().To<MessageDB>().WithParameter(new ConstructorArgument("msg", 1));
//Ø WithPropertyValue:指定相关的属性值,还有回调方法的重载。
#endregion
//_Kernel.Bind<ISay>().To<EnglishSay>().WithPropertyValue("IsEngOrUSALangle", false);//3.属性绑定,必须有无参构造函数。同样可以写成:Bind<IMessage>().To<MessageDB>().WithParameter(new ConstructorArgument("msg", 1));
//_Kernel.Bind<PeoChina>().ToSelf();//4、自我绑定.自我绑定后,ISay无需传递。IPeople pEoChina = PeoKernel.PeoKernelSigle.KernelSingle.Get<PeoChina>(); #endregion
#region 属性注入
//_Kernel.Bind<ISay>().To<AniSay>();
//_Kernel.Bind<AniDog>().ToSelf();//在AniDog中,ISay属性必须添加[Ninject.Inject]特性
#endregion
#region 条件绑定
//把ChinaSay指定为PeoChina中的ISay
_Kernel.Bind<ISay>().To<ChinaSay>().WhenInjectedInto<PeoChina>();//1、一般绑定,必须有无参数构造函数
//把EnglishSay指定为PeoEnglish中的ISay。同时EnglishSay传递参数true
_Kernel.Bind<ISay>().To<EnglishSay>().WhenInjectedInto<PeoEnglish>().WithConstructorArgument(true);//2.构造函数中,参数绑定,可以没有无参数构造函数
_Kernel.Bind<PeoChina>().ToSelf();
_Kernel.Bind<PeoEnglish>().ToSelf();
#endregion
#region 线程调用
_Kernel.Bind<ISay>().To<ChinaSay>().InThreadScope();//可以线程调用
#region 调用 指定了对象在InThreadScope,在使用的代码中分别创建了2个线程来进行模拟,最终每个线程都是创建了一个对象。
using (IKernel tKer = new StandardKernel(new PeoKernelServer()))
{
Thread tT1 = new Thread(new ThreadStart(() =>
{
ISay tPeoSay = tKer.Get<ISay>();
tPeoSay.SayLanager();
}));
Thread tT2 = new Thread(new ThreadStart(() =>
{
ISay tPeoSay = tKer.Get<ISay>();
tPeoSay.SayLanager();
}));
tT1.Start();
tT2.Start();
}
#endregion #endregion
}
}
#endregion
#region 伪代码
public interface ISay
{
string SayLanager();
}
public class ChinaSay : ISay
{
public ChinaSay()
{ }
public string SayLanager()
{
return "汉语";
}
}
public class EnglishSay : ISay
{
private bool _isEngOrUSALangle = false; public bool IsEngOrUSALangle
{
get { return _isEngOrUSALangle; }
set { _isEngOrUSALangle = value; }
}
public EnglishSay()
{ }
public EnglishSay(bool isEngOrUSALangle)
{
_isEngOrUSALangle = isEngOrUSALangle;
}
public string SayLanager()
{
string strEngLan = "EngLan";
if (_isEngOrUSALangle)
{
strEngLan = "USALan";
}
return strEngLan;
}
}
public interface IPeople
{
string Name { get; set; }
void sayHello();
}
public abstract class PeopleBase : IPeople
{
protected string _Name = "";
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
} public virtual void sayHello()
{
throw new NotImplementedException();
}
}
public class PeoChina : PeopleBase
{
public PeoChina()
{
}
private ISay _Say;
public PeoChina(ISay pSay)
{
_Say = pSay;
}
public override void sayHello()
{
MessageBox.Show(string.Format("我是中国人,我叫:{0},我说:{1}", _Name, _Say.SayLanager()));
}
}
public class PeoEnglish : PeopleBase
{
private ISay _Say;
public PeoEnglish()
{ }
public PeoEnglish(ISay pSay)
{
_Say = pSay;
}
public override void sayHello()
{
MessageBox.Show(string.Format("I am English,my name is :{0},I Say:{1}", _Name, _Say.SayLanager()));
}
} public class AniSay : ISay
{
public AniSay()
{ }
public string SayLanager()
{
return "wang";
}
}
public class AniDog
{
[Ninject.Inject]//属性注入
public ISay jiao { get; set; }
public void gouJiao()
{
MessageBox.Show(jiao.SayLanager());
}
}
#endregion

Ninject使用介绍的更多相关文章

  1. 轻量级IOC框架:Ninject (上)

    前言 前段时间看Mvc最佳实践时,认识了一个轻量级的IOC框架:Ninject.通过google搜索发现它是一个开源项目,最新源代码地址是:http://github.com/enkari/ninje ...

  2. Ninject学习笔记<四>

    前言 前段时间看Mvc最佳实践时,认识了一个轻量级的IOC框架:Ninject.通过google搜索发现它是一个开源项目,最新源代码地址是:http://github.com/enkari/ninje ...

  3. ASP.NET MVC使用Ninject

    Ninject是一个快如闪电的,轻量级的.....依赖注入框架,呃呃呃,貌似很少用到,Ninject就是一个DI容器,作用是对ASP.NET MVC程序中的组件进行解耦 ,说到解耦其实也有其他的方式可 ...

  4. Ninject框架的介绍

    Ninject是C#语言的一款依赖性的注入器框架,我认为之所以会出现这个框架是因为类与类由于继承或者接口与类继承而出现的,首先这 个最典型存在是因为接口,首先我们来看看这个用了框架和没有用框架的区别吧 ...

  5. ASP.NET MVC学前篇之Ninject的初步了解

    ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开 ...

  6. [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject

    本人博客已转移至:http://www.exblr.com/liam  为什么需要依赖注入 在[ASP.NET MVC 小牛之路]系列的理解MVC模式文章中,我们提到MVC的一个重要特征是关注点分离( ...

  7. [ASP.NET MVC 小牛之路]05 - 使用 Ninject

    在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事情,续这篇文章之后,本文将用一个实际的示例来 ...

  8. Ninject之旅之十一:Ninject动态工厂(附程序下载)

    摘要 如果我们已经知道了一个类所有的依赖项,在我们只需要依赖项的一个实例的场景中,在类的构造函数中引入一系列的依赖项是容易的.但是有些情况,我们需要在一个类里创建依赖项的多个实例,这时候Ninject ...

  9. Ninject之旅之八:Ninject插件模型(附程序下载)

    摘要 在前面的章节中,我们看了在单一的绑定条件下Ninject能够处理依赖类型,就是说,每个服务类型只绑定到单一的实现类型.然而,有些情况下我们需要绑定一个抽象服务类型到多个实现,这叫多个绑定.多个绑 ...

随机推荐

  1. Python学习路程day17

    常用算法与设计模式 选择排序 时间复杂度 二.计算方法 1.一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费 ...

  2. Varnish介绍

    “Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang (http://www.vg.no) 使用3台Varnish代替了原来的12台squid,性能居然比以前 ...

  3. UCanCode发布升级E-Form++可视化源码组件库2014 全新版 (V20.01)!

    UCanCode发布升级E-Form++可视化源码组件库2014 全新版 (V20.01)! --- UCanCode有史以来最强大的版本发布! E-Form++可视化源码组件库企业版本2014最新版 ...

  4. 深入理解JavaScript系列:试着谈谈闭包

    闭包可能是JavaScript里最被人神乎其神的一个概念,世间万物皆凡夫俗子,你觉着他神奇是因为你根本没有了解,所有的事物当你了解透彻后就不会有这种不明觉厉的错觉了.哈哈哈,上来又是一顿哲学普及. 下 ...

  5. 【LeetCode】Gray Code

    Gray Code The gray code is a binary numeral system where two successive values differ in only one bi ...

  6. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

  7. win764位Ruby2.0环境搭建之Ruby on Rails

    一:安装Ruby 1.在http://rubyinstaller.org 下载需要的ruby版本,因为是exe文件,所以,你可以直接安装. 安装结束后,cmd上运行 ruby -v 显示版本号.如果正 ...

  8. 在​W​C​F​中​使​用​消​息​队​列​M​S​M​Q

    在WCF中使用消息队列MSMQ 在windows平台上,MSMQ是首选的消息传递中间件,它是一种高速.异步.可靠的通信机制,当我们在Internet上的两个应用需要交换信息时,使用这样的中间件可能是必 ...

  9. Mongodb在Windows 7下的安装及配置

    第一步 下载MongoDB: 下载mongodb的windows版本,有32位和64位版本,根据操作系统情况下载,下载地址:http://www.mongodb.org/downloads 解压缩至指 ...

  10. Installshield调用DLL的正确姿势

    脚本如下 szDllPath = SUPPORTDIR ^ "TestCom.dll";       set oMyTest = CoCreateObjectDotNet(szDl ...