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

 更新时间:2018年12月09日 09:27:35   作者:我不要做码农  
这篇文章主要给大家介绍了关于ASP.NET MVC使用Ninject的相关资料,文中通过示例代码介绍的非常详细,对大家啊的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

总结

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

相关文章

  • ASP.NET操作Word的IIS权限设置

    ASP.NET操作Word的IIS权限设置

    检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。
    2011-02-02
  • asp.net repeater实现批量删除

    asp.net repeater实现批量删除

    asp.net repeater实现批量删除实现效果代码
    2009-03-03
  • asp.net 纯真ip库取得所在地实现代码

    asp.net 纯真ip库取得所在地实现代码

    asp.net 纯真ip库取得所在地实现代码,需要的朋友可以参考一下。
    2009-05-05
  • 客户端用JavaScript填充DropDownList控件 服务器端读不到值

    客户端用JavaScript填充DropDownList控件 服务器端读不到值

    今天遇到一个奇怪的问题,某一页面需要使用三级级联下拉列表框。为提高用户体验,采用jQuery的cascadingDropDown插件调用后台Web Services来实现ajax填充。
    2010-09-09
  • .NET Core 3.0中WPF使用IOC的图文教程

    .NET Core 3.0中WPF使用IOC的图文教程

    这篇文章主要给大家介绍了关于在.NET Core 3.0中WPF使用IOC的图文教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • .NET数组使用中的注意事项小结

    .NET数组使用中的注意事项小结

    这篇文章主要介绍了.NET数组使用中的注意事项,总结了常见的三个数组使用中的注意事项,对于.NET初学者有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • asp.net 独立Discuz头像编辑模块分离打包

    asp.net 独立Discuz头像编辑模块分离打包

    在Discuz产品系列(包括UCenter、UCHome)中有一个flash头像上传编辑的功能比较好用,和之前自己用js实现的照片在线编辑插件比较像,于是想将它独立出来,一方面可以学习研究,另一方面有机会可以在项目中使用(这里主要是指Asp.Net程序,php的与之类似)。
    2011-06-06
  • MultiLine 换行后实现读取不换行的具体思路

    MultiLine 换行后实现读取不换行的具体思路

    输入内容中有换行,保存到数据库,直接查看感觉没有换行,但查询结果“以文本格式显示结果”你就会发现 其实是有换行的,下面与大家分享下具体的解决方法
    2013-06-06
  • ASP.NET Core MVC控制器请求依赖注入

    ASP.NET Core MVC控制器请求依赖注入

    这篇文章介绍了ASP.NET Core MVC控制器请求依赖注入的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • .Net Core跨平台应用开发串口篇HelloArm

    .Net Core跨平台应用开发串口篇HelloArm

    这篇文章介绍了.Net Core跨平台应用开发串口篇HelloArm,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01

最新评论