</pre><p></p><pre name="code" class="csharp">
第一次写文章,就吧昨天看书学习的Ninject,使用方法给大家说一说。
首先 Ninject 通俗点说就是帮你初始化对象的这么一个东西,看下源代码
IValueCalculator calc = new LinqValueCalculator();
我们看到当要使用对象的时候必须要创建 LinqValueCalculator 对象,在实际项目中需要操作很多对象,这样一一创建非常不理智,这个时候Ninject出现,让它来帮我们完成吧。
要使用必须要有Ninject组件,我用Nuget方式下载安装 如图:(我用的是mvc4 空项目测试)
安装完成之后,我们在Model下建立以下几个类 IValueCalculator,LinqValueCalculator 是继承关系
public class DiscountHelper : IDiscountHelper
{
public decimal DiscountSize { get; set; }
public decimal ApplyDiscount(decimal totalParam)
{
return (totalParam - (DiscountSize / 100m * totalParam));
}
}
public class LinqValueCalculator : IValueCalculator
{
private IDiscountHelper discount;
public LinqValueCalculator(IDiscountHelper discountParam)
{
discount = discountParam;
}
public decimal ValueProducts(IEnumerable<Products> products)
{
//return products.Sum(p => p.Price);
return discount.ApplyDiscount(products.Sum(s => s.Price));
}
}
然后创建一个基础类NinjectDependencyResolver 继承IDependencyResolver
public class NinjectDependencyResolver:IDependencyResolver
{
private IKernel kernel;
public NinjectDependencyResolver()
{
kernel = new StandardKernel();
AddBindings();
}
//mvc在需要一个实例以便对一个传入的请求进行服务时,会调用GetService(),GetServices()方法
public object GetService(Type serviceType)
{
return kernel.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return kernel.GetAll(serviceType);
}
private void AddBindings()
{
kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
kernel.Bind<IDiscountHelper>().To<DiscountHelper>().WithPropertyValue("DiscountSize", 50M).WithPropertyValue("DiscountSize2", 1M);
kernel.Bind<IDiscountHelper>().To<FlexibleDiscountHelper>().WhenInjectedInto<LinqValueCalculator>();//当注入LinqValueCalculator时使用FlexibleDiscountHelper
}
}
然后在 Global.asax 注册以下,告诉mvc框架要使用的以来解析器
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
//告诉MVC框架 我要用自己的依赖解析器
DependencyResolver.SetResolver(new NinjectDependencyResolver());
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
public class HomeController : Controller
{
//
// GET: /Home/
private Products[] products = {
new Products{Name="aa",Category="aaaa",Price=90.5M},
new Products{Name="bb",Category="bbbb",Price=9.4M},
new Products{Name="cc",Category="cccc",Price=0.1M}
};
private IValueCalculator calc;
public HomeController(IValueCalculator calcParam)
{
calc = calcParam;
}
public ActionResult Index()
{
//IValueCalculator calc = new LinqValueCalculator();
ShoppingCart cart = new ShoppingCart(calc) { myProducts = products };
decimal tot = cart.CalculateProductTotal();
return View(tot);
}
}
可以看出在调用的时候声明一个属性 在整个home控制器下都可以进行访问,创建实例的活就交个ninject去干。
其实不只有ninject可以干这个,还有很多可以达到同样的效果,比如spring.net 等都是很好用的。
ps:第一次写,漏写了好多,毕竟上班时间写的,有点乱,还请多多体谅。