Ninject 是跟Unity 差不多的DI容器。Ninject 推荐零配置,快速使用。小中型项目,最适合。

通过nuget,安装Ninject.MVC。略。参考博客:Ninject依赖注入     WebForm中使用

场景模拟  项目下载地址:https://coding.net/u/chenxygx/p/CodeSave/git/tree/master/EssentialTools

定义一个计算产品的接口,IValueCalculator,往后都会围绕产品计算,来进行依赖注入。

namespace EssentialTools.Models
{
public interface IValueCalculator
{
decimal ValueProduct(IEnumerable<Product> products);
}
}

IValueCalculator

接下来定义产品实现,LinqValueCalculator

public class LinqValueCalculator : IValueCalculator
{
public decimal ValueProduct(IEnumerable<Product> products)
{
return products.Sum(p => p.Price);
}
}

LinqValueCalculator

Product,就是一个普通的实体类,就不贴了。

然后在控制器中,使用Ninject进行输出。

 public class HomeController : Controller
{
private IValueCalculator calc;
private Product[] products = {
new Product { Name="Kayak",Category="Watersports",Price = 275M },
new Product { Name="Lifejacket",Category="Watersports",Price = 48.95M },
new Product { Name="Soccer ball",Category="Soccer",Price = 19.50M },
new Product { Name="Corner flagW",Category="Soccer",Price = 34.95M }
};
// GET: Home
public ActionResult Index()
{
IKernel kernel = new StandardKernel();
kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
IValueCalculator calc = kernel.Get<IValueCalculator>();
return View(calc.ValueProduct(products));
}
}

HomeController

接下来,把Ninject跟MVC进行整合操作。首先需要添加一个Ninject依赖项解析器,NinjectDependencyResolver

 public class NinjectDependencyResolver : IDependencyResolver
{
private IKernel kernel;
public NinjectDependencyResolver(IKernel kernelParam)
{
kernel = kernelParam;
AddBindings();
} private void AddBindings()
{
kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
}
public object GetService(Type serviceType)
{
return kernel.TryGet(serviceType);
} public IEnumerable<object> GetServices(Type serviceType)
{
return kernel.GetAll(serviceType);
}
}

NinjectDependencyResolver

主要作用就是在页面加载之前,进行依赖注入。然后我们将解析器与MVC关联一下。在App_Start的NinjectWebCommon里面修改

private static void RegisterServices(IKernel kernel)
{
new NinjectDependencyResolver(kernel);
}

这样,在MVC程序运行后,会首先进行依赖注入。然后就可以在需要的时候,控制反转出实例了。

接下来,实现构造器的控制反转

public class HomeController : Controller
{
private IValueCalculator calc;
public HomeController(IValueCalculator calcParam)
{
calc = calcParam;
} // GET: Home
public ActionResult Index()
{
return View(calc.ValueProduct(products));
}
}

HomeController

控制反转会考察依赖项是否依赖其他类型,例如如果LinqValueCalculator,还有依赖项,则也会进行控制反转。

指定属性参数值

可以使用 WithPropertyValue 指定实例中属性的值。

kernel.Bind<IDiscountHelper>().To<DefuaultDicountHelper>().WithPropertyValue("DiscountSize", 50M)

会传递50M到DefuaultDicountHelper里面的 DiscountSize属性。

指定构造器参数

可以使用 WinthConstructorArugment方法指定构造器中参数的值。

 kernel.Bind<IDiscountHelper>().To<DefuaultDicountHelper>().WithConstructorArgument("discountParam",50M);

public DefuaultDicountHelper(decimal discountParam)
{
DiscountSize = discountParam;
}

条件绑定

可以针对依赖注入设置对应条件,例如:要创建 LinqValueCalculator对象时,使用FlexibleDiscountHelper 作为 IDiscountHelper接口的实现。

kernel.Bind<IDiscountHelper>().To<FlexibleDiscountHelper>().WhenInjectedInto<LinqValueCalculator>();

WhenInjectedInto<T>()   当要被注入的类是类型T时,进行绑定

WhenClassHas<T>()   当被注入的类以注解属性进行注释,而类型为T时,进行绑定

作用域

可以设置绑定的作用域

kernel.Bind<IValueCalculator>().To<LinqValueCalculator>().InRequestScope();

InRequestScope()   创建一个单一实例,用于解析一个HTTP请求中各个对象的依赖项

InThreadScope()   创建一个单一实例,将其用于解析一个线程中各个对象的依赖项

InSingletonScope()  使其共享于整个应用程序

Ninject.MVC 知识点记录的更多相关文章

  1. MVC知识点记录

    _Layout.cshtmlRenderSectionsection 分部页的使用@Html.Partial Html.RenderPartial与 Html.RenderAction的 return ...

  2. spring mvc开发过程知识点记录

    给一个客户做的一个小项目,需求就是输入类似一个短网址http://dd.yy/xxxx然后跳转到另外一个域名下的图书文件.(实际很多短网址站都提供API供调用吧,不过客户需求是他自己建立一个短网址服务 ...

  3. C#知识点记录

    用于记录C#知识要点. 参考:CLR via C#.C#并发编程.MSDN.百度 记录方式:读每本书,先看一遍,然后第二遍的时候,写笔记. CLR:公共语言运行时(Common Language Ru ...

  4. javascript知识点记录(1)

    javascript一些知识点记录 1.substring,slice,substr的用法 substring 和slice 都有startIndex 和 endIndex(不包括endInex),区 ...

  5. JavaScript算法与数据结构知识点记录

    JavaScript算法与数据结构知识点记录 zhanweifu

  6. DB知识点记录

    DB知识点记录 分页 SqlServer:ROW_NUMBER () over (ORDER BY ID) AS RN, MySql:limit Oracle:ROWNUM AS RN 数据表的基本结 ...

  7. 【千纸诗书】—— PHP/MySQL二手书网站后台开发之知识点记录

    前言:使用PHP和MySQL开发后台管理系统的过程中,发现有一些通用的[套路小Tip],这里集中记录一下.结合工作中ing的后台业务,我逐渐体会到:除了技术知识外.能使用户体验好的“使用流程设计”积累 ...

  8. 计算机二级C语言选择题错题知识点记录。

    计算机二级C语言选择题错题知识点记录. 1,在数据流图中,用标有名字的箭头表示数据流.在程序流程图中,用标有名字的箭头表示控制流. 2,结构化程序设计的基本原则:自顶向下,逐步求精,模块化,限制使用g ...

  9. Spring MVC知识点整理

    网上Spring MVC相关知识点的介绍已经有很多了,但是大部分文章都是介绍其中的一部分知识点. 本文希望能够向读者做一个基本整体的介绍,首先我们先来了解下Spring MVC的基础接口和组件.   ...

随机推荐

  1. 0 bug 读后感

    本书全名是 <0 bug- C/C++商用工程之道>,这是一本有争议的书,豆瓣链接: http://book.douban.com/subject/4149139/ ,建议有一些商用的开发 ...

  2. 实用工具 : Xaml Power Toys

    最近挺忙, 憋了一肚子的东西没有分享. 今天分享一个 Xamarin.Forms / WPF 的增强工具 , Visual Studio 扩展 : Xaml Power Toy 可以直接在 VS201 ...

  3. MySQL5.6 实现主从复制,读写分离,分散单台服务器压力

    闲来无事,在本地搭建几台虚拟机,准备配一个mysql读写分离的主从配置,版本选用最新版的,mysql.5.6.28 版本,本处使用源码安装(鄙人一向喜欢源码安装,因为centos中鄙人不知道yum安装 ...

  4. 边界网关协议BGP

    Border Gateway Protocol (BGP) is a standardized exterior gateway protocol designed to exchange routi ...

  5. 【心得】在脱离TFS的情况下,如何解除TFS绑定?

    我们知道在有TFS的情况下,在文件-源代码管理-高级中可以解除TFS绑定. 但是如果我们出差去了,拿着笔记本电脑,打开解决方案的时候,会总是提示无法连接TFS,并且在源代码管理处尝试解除的时候也提示无 ...

  6. clean之后R文件消失

    首先确定你的SDK是新的. 其次接下来检查你的.xml文件,文件名不能大写. 如果xml文件太多 ,那么clean一下你的项目,这时候注意看Console的提示. Console会提示你xml文件错误 ...

  7. springMVC之AOP

    AOP(Aspect-Oriented Programming,面向切面编程) 切面(Aepect):横切关注点(跨越应用程序多个模块的功能)被模块化的对象: 通知(Advice):切面必须要完成的工 ...

  8. JVM垃圾收集器介绍

    垃圾回收算法是GC的方法论,垃圾收集器就是内存回收的具体实现. 一.Serial 收集器 单线程收集器,在进行GC时,必须暂停所有的工作线程(Stop The World),直到GC收集结束. 缺点: ...

  9. 二、处理MVC多级目录问题——以ABP为基础架构的一个中等规模的OA开发日志

    就个人感觉而言.ASP.NET MVC是一种非常反人类的设计.(我没有接触过Java的MVC,不知道两者是否一样.如果一样,那么搞Java的同学也挺可怜.)尤其是MVC的路由机制,灰常灰常反动.路由所 ...

  10. lucene-查询query->PrefixQuery使用前缀搜索

    PrefixQuery就是使用前缀来进行查找的.通常情况下,首先定义一个词条Term.该词条包含要查找的字段名以及关键字的前缀,然后通过该词条构造一个PrefixQuery对象,就可以进行前缀查找了. ...