使用Ninject的一般步骤

Posted zcl-cnblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Ninject的一般步骤相关的知识,希望对你有一定的参考价值。

以下为DI控制反转个人理解烦请各位大牛指教~

编写程序时我们应当遵循抵耦合高内聚的原则(各个功能模块互不依赖).

我们可以利用面向对象里面接口的特性来进行DI控制反转,让功能模块全部依赖接口,而不依赖具体的实现类,当程序跑起来以后通过注入的方式注入具体的实现类如一下代码:

/// <summary>
    /// 购物车类
    /// </summary>
    public class ShoppingCart {
        /// <summary>
        /// 创建计算器接口
        /// </summary>
        IvalueCalculator calculator;


        /// <summary>
        /// 构造函数来注入实际调用的计算方法
        /// </summary>
        /// <param name="ivalueCalculator"></param>
        public ShoppingCart(IvalueCalculator ivalueCalculator)
        {
            calculator = ivalueCalculator;
        }

        /// <summary>
        /// 价格计算
        /// </summary>
        /// <returns></returns>
        public decimal CalculateStockValue()
        {
            Product[] products = {
                new Product {Name = "西瓜", Category = "水果", Price = 2.3M},
              new Product {Name = "苹果", Category = "水果", Price = 4.9M},
              new Product {Name = "空心菜", Category = "蔬菜", Price = 2.2M},
              new Product {Name = "地瓜", Category = "蔬菜", Price = 1.9M}
            };
            decimal totalValue = calculator.ValueProducts(products);
            return totalValue;
        }


    }


    /// <summary>
    /// 计算器实现类
    /// </summary>
    public class LinqValueCalculator : IvalueCalculator
    {
        /// <summary>
        /// 价格计算实现方法
        /// </summary>
        /// <param name="products"></param>
        /// <returns></returns>
        public decimal ValueProducts(params Product[] products)
        {
            return products.Sum(u => u.Price);
        }


    }

    /// <summary>
    /// 计算器接口
    /// </summary>
    public interface IvalueCalculator
    {
        /// <summary>
        /// 价格计算方法
        /// </summary>
        /// <param name="products"></param>
        /// <returns></returns>
        decimal ValueProducts(params Product[] products);
    }

 

这样,购物车类就实现了松耦合,购物车内的计算价格方法只依赖于计算器接口(IvalueCalculator ),而不依赖具体的计算类(LinqValueCalculator),实际的价格计算类我们通过构造函数的方法注入到购物车内的计算器接口

 

当我们在实际使用时既可以像如下方法一样实现

static void Main(string[] args)
        {
               //创建一个接口的对象,引用计算类
            IvalueCalculator calculator = new LinqValueCalculator();
            //以方法传入具体实现类
            ShoppingCart shopping = new ShoppingCart(calculator);
        //调用
            Console.WriteLine("价格:{0}", shopping.CalculateStockValue());
            Console.ReadLine();
        }

 

 

可以通过C#的 Ninject 来管理各种注入,只需要提前绑定好接口的对应实现类既可以在使用时去索要一个对应的实现类,如下代码

     //Ninject
            IKernel ninjectKernel = new StandardKernel();
            //把一个接口(IValueCalculator)绑定到一个实现该接口的类(LinqValueCalculator)
            ninjectKernel.Bind<IvalueCalculator>().To<LinqValueCalculator>();
            
            //向NiNject索要一个IvalueCalculator的实现类
            IvalueCalculator calcImpl = ninjectKernel.Get<IvalueCalculator>();
            //注入购物车类
            ShoppingCart shopping = new ShoppingCart(calcImpl);

            Console.WriteLine("价格:{0}", shopping.CalculateStockValue());
            Console.ReadLine();

 

以上是关于使用Ninject的一般步骤的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net Web 窗体上实现 Ninject 或 DI?

尝试为 WCF 安装 nInject 时找不到 NinjectWcfApplication 参考

使用Ninject进行DI(依赖注入)

MVC+Ninject+三层架构+代码生成 -- 总结(數據層)

Note3:大话Ninject

使用 Ninject 和 wpf 从所有程序集中加载模块