Ninject依赖性链(转载)

转载自http://www.cnblogs.com/tylerdonet/p/3297915.html

继续Niject基础的代码,追加折扣的计算方式

    public interface IDiscountHelper
    {
        decimal ApplyDiscount(decimal totalParam);
    }
    public class DefaultDiscountHelper : IDiscountHelper
    {
        private decimal discountRate;

        public DefaultDiscountHelper(decimal discountParam)
        {
            this.discountRate = discountParam;
        }

        public decimal ApplyDiscount(decimal totalParam)
        {
            return totalParam - discountRate / 100M * totalParam;
        }
    }

计算方式变更==》

    public class LinqValueCalculator : IValueCalculator
    {
        private IDiscountHelper discounter;

        public LinqValueCalculator(IDiscountHelper discountParam)
        {
            discounter = discountParam;
        }

        public decimal ValueProducts(params Product[] products)
        {
            return discounter.ApplyDiscount(products.Sum(p => p.Price));
        }
    }

综上可知追加了一个IDiscountHelper到DefalutDiscountHelper的依赖注入,但是DefalutDiscountHelper实例化时是带参数的,所以IOC代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            var ninjectKernel = new StandardKernel();

            ninjectKernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
            ninjectKernel.Bind<IDiscountHelper>()
                .To<DefaultDiscountHelper>().WithConstructorArgument("discountParam", 5M); // 95折

            IValueCalculator calcImpl = ninjectKernel.Get<IValueCalculator>();
            ShoppingCat cart = new ShoppingCat(calcImpl);
            Console.WriteLine(cart.CalculatStockValue());
            Console.Read();
        }
    }

当IValueCalculater被请求的时候,Ninject知道它要实例化的是LinqValueCalculator,然后进一步考察这个类,并发现他依赖一个可以解析的接口,Ninject会创建DefaultDiscountHelper的一个实例,并把它注入到LinqValueCalculator类的构造器中,一IValueCalculator作为返回结果,不管这个依赖性链有多长,多复杂,Ninject都会以这种方式检查它要实例化的每一个依赖性。

====================================================

如果带参构造,用属性的话:

    public class DefaultDiscountHelper : IDiscountHelper
    {
        public decimal discountRate { get; set; }

        public decimal ApplyDiscount(decimal totalParam)
        {
            return totalParam - discountRate / 100M * totalParam;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var ninjectKernel = new StandardKernel();

            ninjectKernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
            ninjectKernel.Bind<IDiscountHelper>()
                .To<DefaultDiscountHelper>().WithPropertyValue("DiscountRate", 5M);

            IValueCalculator calcImpl = ninjectKernel.Get<IValueCalculator>();
            ShoppingCat cart = new ShoppingCat(calcImpl);
            Console.WriteLine(cart.CalculatStockValue());
            Console.Read();
        }
    }

 

posted @ 2015-06-23 16:40  江境纣州  阅读(119)  评论(0编辑  收藏  举报