#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. PHP下使用强大的imagick轻松生成组合缩略图

    project: blog target: use-imagick-to-composite-images-thumbnail.md date: 2016-02-19 status: publish ...

  2. SQLite常用命令总结

    1) 创建数据库文件: >SQLite3 d:\test.db 回车 就生成了一个test.db在d盘. 这样同时也SQLite3挂上了这个test.db 2) 用.help可以看看有什么命令 ...

  3. 进程间通信 System V 消息队列

    1.msgget (key_t ket,int flag) ; //创建一个新的消息队列或者访问一个已存在的消息队列 2.msgsnd(int msid, const void *ptr ,size_ ...

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

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

  5. iOS应用性能调优好文mark

    http://www.cocoachina.com/ios/20150408/11501.html

  6. AJAX实现异步登录

    //代码较为简单,只是测试所用 1.html登录页面代码 <table> <tr> <td>用户名:</td> <td><input ...

  7. HTML标签整理

    第一次接触动态网站的相关代码,对程序里HTML的标签不理解.在这里会把碰到的HTML标签整理出来,持续更新. 1.<form></form>:用于声明表单,定义采集数据的范围, ...

  8. PID算法学习记录

    最近做项目需要用到PID算法,这个本来是我的专业(控制理论与控制工程),可是我好像是把这个东西全部还给老师了. 没办法,只好抽时间来学习了. 先占个座,后续将持续更新!

  9. SQL Server 2008 R2没有卸载干净

    在卸载Microsoft SQL Server 2008 R2 安装程序(简体中文) 出现 :“警告 26003.无法卸载 Microsoft SQL Server 2008 R2 安装程序支持文件, ...

  10. css总结(更新中...)

    下面总结的都是我实际使用后有效的. 1.select的默认样式不好看,怎么去掉默认样式呢,如下: .select{text-indent: inherit !important; background ...