Ninject
作用:
解耦合
nuget包:
Ninject.MVC5
Ninject
Ninject.Web.Common
代码段:
接口代码:
public interface ILinqValueCalculator
{
decimal ValueProducts(List<Product> products);
}
接口实现代码:
public class LinqValueCalculator:ILinqValueCalculator
{
public decimal ValueProducts(List<Product> products)
{
return products.Sum(x => x.Price);
}
}
使用场景Ninject代码:
public class HomeController : Controller
{
private List<Product> products = new List<Product>
{
new Product{ Name="名称1", Price=1 },
new Product{ Name="名称2", Price=2 },
new Product{ Name="名称3", Price=3 },
new Product{ Name="名称4", Price=4 },
new Product{ Name="名称5", Price=5 },
new Product{ Name="名称6", Price=6 }
};
public ActionResult Home()
{
IKernel kernel = new StandardKernel();
kernel.Bind<ILinqValueCalculator>().To<LinqValueCalculator>();
ILinqValueCalculator calc = kernel.Get<ILinqValueCalculator>();
ShoppingCar shoppingCar = new ShoppingCar(calc) { products = products };
return View(shoppingCar.CalculateProductTotal());
}
}
Ninject MVC5 依赖解析器
创建依赖解析器
public class NinjectDependercyResolver : IDependencyResolver
{
private IKernel kernel;
public NinjectDependercyResolver(IKernel kernelParam)
{
kernel = kernelParam;
AddBindings();
}
public object GetService(Type serviceType)
{
return kernel.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return kernel.GetAll(serviceType);
}
private void AddBindings()
{
kernel.Bind<ILinqValueCalculator>().To<LinqValueCalculator>();
}
}
注册依赖解析器
Ninject.MVC5与Ninject.MVC3不同,不会再创建NinjectWebCommon.cs,而是在Global.asax文件里注册;使用我们自定义的NinjectDependencyResolver来替换mvc5中默认的DependencyResolver,
这样就能够让mvc5支持DI,依赖注入。
DependencyResolver.SetResolver(new NinjectDependercyResolver(new StandardKernel()));
改造Ninject使用代码
public class HomeController : Controller
{
private ILinqValueCalculator calc;
private List<Product> products = new List<Product>
{
new Product{ Name="名称1", Price=1 },
new Product{ Name="名称2", Price=2 },
new Product{ Name="名称3", Price=3 },
new Product{ Name="名称4", Price=4 },
new Product{ Name="名称5", Price=5 },
new Product{ Name="名称6", Price=6 }
};
public HomeController(ILinqValueCalculator calcParam)
{
calc = calcParam;
}
public ActionResult Home()
{
ShoppingCar shoppingCar = new ShoppingCar(calc) { products = products };
return View(shoppingCar.CalculateProductTotal());
}
}