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就介绍到这了,如有不对,请多多包涵

总结

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

(0)

相关推荐

  • 使用ASP.NET.4.5.1+MVC5.0 搭建一个包含 Ninject框架 项目

    1.创建一个空白解决方案 2.添加一个类库 名称为XXX.Domain 3.添加一个ASP.MVC名称为XXX.WebUI 4.选着空模版,勾选MVC核心引用 5.添加单元测试项目XXX.UntiTests 6.在程序包控制台里面输入以下代码 复制代码 代码如下: Install-Package Ninject -version 3.0.1.10 -projectname Toad.WebUI Install-Package  Ninject.Web.Common  -version  3.0.

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

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

  • Asp.net MVC scheduler的实现方法详解

    Asp.net MVC scheduler的实现方法详解 本例使用了fullcalendar js : https://fullcalendar.io/ 1. view : @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } @section PageContent{ <style> .modal-backdrop { z-index: 9; } </sty

  • ASP.NET MVC 使用Bootstrap的方法

    作为一名Web开发者而言,如果不借助任何前端框架,从零开始使用HTML和CSS来构建友好的页面是非常困难的.特别是对于Windows Form的开发者而言,更是难上加难. 正是由于这样的原因,Bootstrap诞生了.Twitter Bootstrap为开发者提供了丰富的CSS样式.组件.插件.响应式布局等.同时微软已经完全集成在ASP.NET MVC 模板中. Bootstrap结构介绍 你可以通过http://getbootstrap.com.来下载最新版本的Bootstrap. 解压文件夹

  • ASP.NET MVC分页的实现方法

    在这一篇文章中,我们将学习如何在MVC页面中实现分页的方法.分页功能是一个非常实用,常用的功能,当数据量过多的时候,必然要使用分页.在今天这篇文章中,我们学习如果在MVC页面中使用PagedList.Mvc包来实现分页功能. 1) 安装PagedList.Mvc 首先,我们需要安装分页组件包,在Visual Studio 2010中点击[项目]-[管理NuGet程序包],打开NuGet包管理器窗体,在该窗体中,选择"联机"标签,然后搜索pagedlist,如下图所示.点击"安

  • ASP.NET MVC文件上传教程(二)

    上文ASP.NET MVC 文件上传教程(一)我们讲了简单的上传以及需要注意的地方,查相关资料时,感觉上传里面涉及到的内容还是比较多,于是就将上传这一块分为几节来处理,同时后续也会讲到关于做上传时遗漏的C#应该注意的地方,及时进行查漏补缺,尽量将这一块完善起来. 引入 上一节我们讲到了上传这一块,有朋友提出未涉及到大文件的上传这一块,思前想后还是来试着做做,毕竟之前没怎么去仔细考虑过这个问题,尤其还可以联系实际开发中创建文件夹等一系列问题,同时关于上传在网上随便找找都充斥着大量的组件,我们何必再

  • asp.net mvc webapi 实用的接口加密方法示例

    在很多项目中,因为webapi是对外开放的,这个时候,我们就要得考虑接口交换数据的安全性. 安全机制也比较多,如andriod与webapi 交换数据的时候,可以走双向证书方法,但是开发成本比较大, 今天我们不打算介绍这方面的知识,我们说说一个较简单也较常见的安全交换机制 在这里要提醒读者,目前所有的加密机制都不是绝对的安全! 我们的目标是,任何用户或者软件获取到我们的webapi接口url后用来再次访问该地址都是无效的! 达到这种目标的话,我们必须要在url中增加一个时间戳,但是仅仅如此还是不

  • Asp.net MVC中Razor常见的问题与解决方法总结

    前言 最近在学习Asp.net MVC Razor,在使用中遇到了不少的问题,所以想着总结下来,没有经验的童鞋就是这样磕磕碰碰出来的经验.话不多说,来一起看看详细的介绍: 一.Datatype的错误提示消息无法自定义 这也许是Asp.net MVC的一个Bug.ViewModel中定义了DataType为Date字段: [Required(ErrorMessage = "Birthday must be input!")] [DataType(DataType.Date, ErrorM

  • ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedList.Mvc)

    ASP.NET MVC中进行分页的方式有多种,但在NuGet上使用最广泛的就是用PagedList.X.PagedList.Mvc进行分页.(原名为:PagedList.Mvc,但是2014年开始,作者将项目名称改名字为"X.PagedList.Mvc"),用这个插件的话会非常便利,大家可以试试,接下来将给大家讲下如何安装这个NuGet插件. ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(原名为PagedList.Mvc) 1.工具--NuGet 程序包管理

  • Asp.net MVC定义短网址的方法

    在MVC的逻辑代码里,Controller和Action是必须的,但是在网址里,并不需要完全体现Controller和Action.比如我们经常希望看到http://localhost/About而不是http://localhost/Home/About. 默认的路由规则 新建MVC应用程序后,Global.asax里默认注册的路由规则是: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRout

  • ASP.NET MVC中使用Bundle打包压缩js和css的方法

    在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压缩(多个文件可以打包成一个文件),并且可以区分调试和非调试,在调试时不进行压缩,以原始方式显示出来,以方便查找问题. 具体优势可自行百度或参看官方介绍:http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification 这里仅简单记录下如何使用. 首先,如果是使用的ASP.NET MVC4基本或者其他内容更丰富的模板,B

随机推荐