【ASP.NET MVC 学习笔记】- 05 依赖注入工具Ninject
本文参考:http://www.cnblogs.com/willick/p/3223042.html
1、Ninject是一款轻量级的DI工具,可通过VS的插件NuGet将其引用到项目中。
2、使用Ninject的步骤:
- 创建一个Ninject的内核对象
//创建Ninject内核实例 IKernel ninjectKernel = new StandardKernel();
- 把公开接口绑定到一个实现了该接口的类上
//绑定接口到实现了该接口的类。这种绑定告诉Ninject,当接收到一个请求IValueCalculator的实现时,返回一个LinqValueCalcutor的实例 ninjectKernel.Bind<IValueCalculator>().To<LinqValueCalculator<();
- 使用Ninject的Get方法获取公开接口的实现
// 获得实现接口的对象实例。Ninject将自动为我们创建LinqValueCalculator类的实例,并返回该实例的引用 IValueCalculator calcImpl = ninjectKernel.Get<IValueCalculator>();
- 调用接口实现类的方法
// 创建ShoppingCart实例并注入依赖 ShoppingCart cart = new ShoppingCart(calcImpl);
// 计算商品总价钱并输出结果 Console.WriteLine("Total: {0:c}", cart.CalculateStockValue());
3、当请求Ninject创建某个类型的实例时,它会检查这个类型和其它类型之间的耦合关系。如果存在依赖关系,那么Ninject会根据依赖处理理它们,并创建所有所需类的实例。
4、Ninject绑定时为属性赋值(支持链式语法):
ninjectKernel.Bind<IDiscountHelper>().To<DefaultDiscountHelper>().WithPropertyValue("DiscountSize", 5M).WithPropertyValue("DiscountSize2", 5M);
5、Ninject绑定时为构造函数传参(支持链式语法):
ninjectKernel.Bind<IDiscountHelper>().To< DefaultDiscountHelper>().WithConstructorArgument("discountParam", 5M).WithConstructorArgument("discountParam2", 5M);
6、Ninject的自绑定:
//没有构造函数参数、属性需要赋值时刺句可省略 ninjectKernel.Bind<ShoppingCart>().ToSelf(); //这种写法不需要关心ShoppingCart类依赖哪个接口,也不需要手动去获取该接口的实现(calcImpl)。 //当通过这句代码请求一个ShoppingCart类的实例的时候,Ninject会自动判断依赖关系,并为我们创建所需接口对应的实现。 ShoppingCart cart = ninjectKernel.Get<ShoppingCart>();
7、Ninject的派生类绑定:
//派生类绑定,其中LimitShoppingCart是ShoppingCart的子类 ninjectKernel.Bind<ShoppingCart>().To<LimitShoppingCart>().WithPropertyValue("ItemLimit", 3M);
8、Ninject的条件绑定:
//条件绑定,IValueCalculator接口现在有两个实现:IterativeValueCalculator和LinqValueCalculator。
//下列语句意思是:如果是把该接口的实现注入到LimitShoppingCart类,那么就用IterativeValueCalculator,其他情况都用LinqValueCalculator。 ninjectKernel.Bind<IValueCalculator>().To<LinqValueCalculator>(); ninjectKernel.Bind<IValueCalculator>().To<IterativeValueCalculator>().WhenInjectedInto<LimitShoppingCart>();