欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC使用Ninject的方法教程

程序员文章站 2022-03-21 14:05:12
为什么要使用ninject? 很多其它类型的ioc容器过于依赖配置文件,老是配置,总感觉有点不爽,而且要使用assembly-qualified名称(也就是类型的全名)来...

为什么要使用ninject?

很多其它类型的ioc容器过于依赖配置文件,老是配置,总感觉有点不爽,而且要使用assembly-qualified名称(也就是类型的全名)来进行定义,稍不注意就会因为打错字而令整个程序崩掉。ninject是一个快如闪电、超轻量级的基于.net平台的ioc容器,主要用来解决程序中模块的耦合问题,它的目的在于做到最少配置。因此如果你不喜欢配置,不喜欢重量级ioc框架,那么就用小苹果ninject吧!

ninject是一个快如闪电的,轻量级的。。。。。依赖注入框架,呃呃呃,貌似很少用到,ninject就是一个di容器,作用是对asp.net mvc程序中的组件进行解耦 ,说到解耦其实也有其他的方式可以达到解耦这个目的,比如接口

public interface itest
{
 decimal valueproducts(ienumerable<product>products) ;
}
public class test:itest
{
 public decimal valueproducts(ienumerable<product>products) 
 {
 return products.sum(p=>p.price);
 }
}
public class shoppingcart
{
 private itest test;
 public ienumerable<product>products{set;get;}
 public shoppingcart( itest test)
 {
 this.test=test;
 }
 public decimal result(products);
}

通过接口可以说达到了我们想要的结果,也就是shopping和test之间的耦合。但是在控制器中却没办法达到这个目的

public actionresult index(){
 itest it=new test();
 shoppingcart cart=new shoppingcart(it);{products=products};
 decimal total=it.result();
 return view(total);
}

我们只能借助ninject来帮我们实现

可以通过nuget下载ninect也可以通过ninject下载

那么我们该怎么使用ninject帮我们解决上述的问题呢?

其实使用ninect不难,一共三个步骤:

//在控制器
public actionresult index()
{
 1:创建一个ninject的内核
 ikernel ninject=new standardkernel();
 2:就是配置ninject内核,其实就是将实现类和接口类绑定在一起
 ninject.bind<itest>().to<test>();
 3:最后一步就是使用ninject创建一个对象了
 itest it=ninject.get<itest>();
}

从创建内核到创建对象跟spring.net倒是很相似。

可能有点点强迫症吧,觉得这么一坨东西放在那里好碍眼吖,不可能叫我每一个动作里面都写这一坨东西吧,当然不是。

下面就创建一个依赖项解析器(好像很高大上一样,其实就是将上面的代码做个封装而已)

public class ninjectresolver:idependencyresolver
{
 private ikernel kernel;
 public ninjectresolver(ikernel kernel)
 {
 this.kernel=kernel; 
 addbinding();
 }
 public ienumerable<object> getservices(type servicetype)
 {
 return kernel.getall(servicetype);
 }
 public object getservice(type servicetype)
 {
 return kernel.tryget(servicetype);
 } 
 void addbinding()
 {
 kernel.bind<itest>().to<test>();
 }
}

idependencyresolver这个是system.mvc里面的继承这个接口必须实现getservices和getservice,addbinding这个方法是用来绑定实现类和接口

getservice方法中的tryget类似于上面的get,当没有合适的绑定时,这个会返回一个null值,不会抛异常,而getservices方法中的getall对单一类型的多个绑定时,可以用到这个

最后一步就是在app_start这一个文件夹中找到ninjectwebcommon.cs这个文件再找到 registerservices(ikernel kernel)这个方法添加system.web.mvc.dependencyresolver.setresolver(newninjectresolver(kernel));

这时候我们修改下控制器中的代码

private itest test;
public homecontroller(itest test)
{
 this.test=test;
}
public actionresult index(){
 shoppingcart cart=new shoppingcart(it);{products=products};
 decimal total=it.result(); return view(total);
}

ninject大概的用法也差不多了,下面说的时ninject比较新颖的东西
就是指定属性或者构造函数传值了,其实也没什么,只是withconstructorargument和withpropertyvalue这两个的使用

public interface ihelper
 {
 decimal applydiscount(decimal totalparam); 
 }
 public class helper : ihelper
 {
 public decimal discountsize { set; get; } 
 
 public decimal applydiscount(decimal totalparam)
 {
 return (totalparam - (discountparam / 100m * totalparam));
 }
 }
private void addbindings()
 {
 kernel.bind<itest>().to<test>();
 
 kernel.bind<ihelper>().to<helper>().withpropertyvalue("discountsize", 50m); kernel.bind<ihelper>().to<helper>().withconstructorargument("discountparam", 50m);
 }

withpropertyvalue这个有两个参数一个是属性名,一个是属性值,这样子可以一开始就给这个属性赋值上默认值,个人感觉作用倒是不大,也有其他的方法可以实现同样效果

withconstructorargument这个也差不多,参数一是构造函数的形参,后面的参数是值

好了,ninject就介绍到这了,如有不对,请多多包涵

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。