zoukankan      html  css  js  c++  java
  • 【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>();
  • 相关阅读:
    c/c++基础 输入函数/流
    数据库的码/键
    sql plus笔记
    cmd delete oracle related
    CAN总线
    SAR ADC : 逐次逼近寄存器型(SAR)模数转换器(ADC)
    Cortex-M3寄存器等基础知识
    Cortex-M3知识点
    ARM指令和Thumb指令区别
    8051、ARM、AVR
  • 原文地址:https://www.cnblogs.com/wangwust/p/6385505.html
Copyright © 2011-2022 走看看