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(); } }