#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】一、除法问题及基本操作(逻辑与,if替代switch)及支持中文打印

    1.查看版本 C:\Users\XXX>python -V Python 2.7.1 2.除法问题(不要整除) from __future__ import division tmp=0x3ec ...

  2. ajax请求!

    ajax请求: var data ='{"useName":"'+name+'",}' $.ajax({ type:"post", url: ...

  3. 炫酷的Linux终端命令大全-1

    1. 命令行日常快捷键. CTRL + U            ------------------------------- 剪切光标前的内容 CTRL + K             ----- ...

  4. 配置和创建一个hibernate简单应用

    1.配置 到http://hibernate.org/orm/下载hibernate包然后解压 在eclipse中新建一个java project,如名为hibernate_test 再所建工程中新建 ...

  5. Android Handler 最佳的理解资料

  6. Record:Handle onClick for our custom LinearLayout for Gallery-like HorizontalScrollView

    Handle onClick for our custom LinearLayout for Gallery-like HorizontalScrollView   The post "Im ...

  7. qt 设置等待事件

    QElapsedTimer et;et.start();while(et.elapsed() < 1000)     QCoreApplication::processEvents();

  8. 学习maple

    定义函数:$f:=(x,y) \rightarrow x^2+y^2$ 类似mathematica的manipulate功能:plots[animate](plot,[f(x,y),x=0..1],y ...

  9. cocos2d-x iOS真机下载非根目录文件提示下载失败解决办法

    在使用cocos api的Downloader或者AssetsManager下载文件到真机Document目录时,如果是直接下载到document根目录,是没问题的,如果是下载存放到了某个不存在的子目 ...

  10. 修改VS 所有项目的Include目录和Lib目录

    像以前的方法 在 工具--选项--项目和解决方案里的修改已经被弃用.