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>();
  • 相关阅读:
    PyQt5-QComboBox控件使用
    PyQt5-按钮控件使用
    PyQt5-QTextEdit控件使用
    Ubuntu12.04下YouCompleteMe安装教程(部分)
    ubuntu下vim的简单配置
    VirtualBox下vim无法正常使用问题解决
    树莓派下ubuntu-mate中ssh服务的安装与开机后自启动
    水仙花小游戏
    C语言实现判断分数等级
    临时记录(不断更新)
  • 原文地址:https://www.cnblogs.com/wangwust/p/6385505.html
Copyright © 2011-2022 走看看