#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与Oracle的主要区别

    Mysql与Oracle区别 1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高. 2. ...

  2. Session Tracking Approaches

    cookies url rewriting hidden field see also: http://www.informit.com/articles/article.aspx?p=29817&a ...

  3. ios--个人资料修改

    点击进行编辑  (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) ...

  4. SharePoint REST Create Folder

    function createListFolder(siteUrl, listName, foldername) { var serverUrl = _spPageContextInfo.webAbs ...

  5. Struts2框架下表单数据的流向以及映射关系

    本例框架很简单:默认页面为用户登录界面login.jsp,提交后由action类LoginAction.java来判断成功或失败,登录结果分别由success.jsp和failure.jsp呈现. 一 ...

  6. 救援linux

    挂载分区 mount /dev/sdaX /mnt/ 挂载其他 mount --bind /dev/ /mnt/dev/ mount --bind /proc/ /mnt/proc/ mount -- ...

  7. 页面上常用的一些小功能--QQ、回到顶部

    1.QQ <script charset="utf-8" type="text/javascript" src="http://wpa.b.qq ...

  8. GDB调试基本命令

    一.列文件清单 list / l 列出产生执行文件的源代码的一部分 //列出 line1 到 line2 行之间的源代码 (gdb) list line1, line2 //输出从上次调用list命令 ...

  9. travel for django

    参考博客:http://www.cnblogs.com/wupeiqi/articles/5237672.html 一:框架的本质: 最原始的框架:服务端一个简单的socket,接收客户端发出的请求, ...

  10. 根据内存布局定位的一个fastdfs坑

    在使用fastdfs时,编写数据上传代码时,遇到一个坑.最终根据指针对应的内存布局定位到一个其client API的一个坑,值得记录一下.具体是在 tracker_connect_server() 这 ...