视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
ASP.NET MVC使用Ninject的方法教程
2020-11-27 22:34:40 责编:小采
文档


为什么要使用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就介绍到这了,如有不对,请多多包涵

总结

下载本文
显示全文
专题