博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC使用Ninject
阅读量:4934 次
发布时间:2019-06-11

本文共 3457 字,大约阅读时间需要 11 分钟。

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

1 public interface ITest 2 { 3     Decimal ValueProducts(IEnumerable
products) ; 4 } 5 public class Test:ITest 6 { 7 public Decimal ValueProducts(IEnumerable
products) 8 { 9 return products.sum(p=>p.Price);10 }11 }12 public class ShoppingCart13 {14 private ITest test;15 public IEnumerable
products{
set;get;}16 public ShoppingCart( ITest test)17 {18 this.test=test;19 }20 public Decimal result(products);21 }
View Vode

     通过接口可以说达到了我们想要的结果,也就是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
().To
(); 3:最后一步就是使用Ninject创建一个对象了 ITest IT=ninject.Get
();}

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

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

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

public class NinjectResolver:IDependencyResolver{   private IKernel kernel;   public  NinjectResolver(IKernel kernel)   {      this.kernel=kernel;            AddBinding();   }    public IEnumerable GetServices(Type serviceType)   {      return kernel.GetAll(serviceType);    }    public Object GetService(Type serviceType)   {       return kernel.TryGet(serviceType);    }       void AddBinding()   {      kernel.Bind
().To
(); }}
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
().To
(); kernel.Bind
().To
().WithPropertyValue("DiscountSize", 50M);  kernel.Bind
().To
().WithConstructorArgument("discountparam", 50M); }
WithPropertyValue这个有两个参数一个是属性名,一个是属性值,这样子可以一开始就给这个属性赋值上默认值,个人感觉作用倒是不大,也有其他的方法可以实现同样效果
WithConstructorArgument这个也差不多,参数一是构造函数的形参,后面的参数是值 好了,Ninject就介绍到这了,如有不对,请多多包涵
 

 

转载于:https://www.cnblogs.com/biao-123/p/10088122.html

你可能感兴趣的文章
关于fixedsys字体 FSEX300.ttf FSEX300-L.ttf FSEX301-L2.ttf
查看>>
hnust 档案管理
查看>>
Redis 并发, 锁, 竞争锁问题.
查看>>
FPGA中的平方根
查看>>
老湿不给你力啊:各种加密解密
查看>>
IE浏览器下同一网页多图片显示的瓶颈与优化[原创]
查看>>
Foundation框架—集合
查看>>
获取同一程序集中的实现类对应的多个接口
查看>>
常见bug ### java.net.SocketException
查看>>
openx
查看>>
JS 控制按钮可用与不可用
查看>>
生活和我
查看>>
47. Largest Rectangle in Histogram && Maximal Rectangle
查看>>
单元测试
查看>>
常用的正则表达式
查看>>
bzoj 3625小朋友和二叉树 多项式求逆+多项式开根 好题
查看>>
用HttpSessionListener与HttpSessionBindingListener实现在线人数统计
查看>>
AngularJS Backbone.js Ember.js 对比
查看>>
Java中的String与常量池
查看>>
Android -- Android JUint 与 Sqlite
查看>>