#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. MySQL数据库3 - MySQL常用数据类型

    一. MySql常用数据类型 数据类型:整数(tinyint smailint int bigint) 定点数 decimal(p,s) ------ 小数点位置固定的       ---> 数 ...

  2. 搭建java web开发环境、使用eclipse编写第一个java web程序

    开发工具:eclipse-jee-juno-SR2-win32-x86_64(请自行官网下载) 使用服务器:apache-tomcat-7.0.35-windows-x64(请自行官网下载) 打开 e ...

  3. EntityFrameworkCore 试用

    引用 EF Core Sqlite Install-Package Microsoft.EntityFrameworkCore.SqlServer 引用 EF Core Tool Install-Pa ...

  4. opendir()函数

    opendir() 函数打开一个目录句柄,可由 closedir(),readdir() 和 rewinddir() 使用. 若成功,则该函数返回一个目录流,否则返回 false 以及一个 error ...

  5. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...

  6. System.Collections.Generic的各容器类的用法

    演示System.Collections.Generic的各容器类的用法. 包括:Dictionary,KeyValuePair,SortedDic tionary,SortedList,HashSe ...

  7. Foundation

    类:NSObject .NSString.NSMutableString.NSNumber.NSValue.NSDate.NSDateFormatter.NSRange.Collections:NSS ...

  8. 编辑距离及其动态规划算法(Java代码)

    编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.一般情况下编辑操作包括: 将一个字符替换成另一个字符: 插入一个字符: 删除一个字 ...

  9. eclipse控制台中文乱码解决方法

    一.全局设置 1.Window > Preferences 2.General > Workspace > Text file encoding. 3.选择 Other 4.手工输入 ...

  10. Apriori 关联分析算法原理分析与代码实现

    前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...