Ninject.MVC 知识点记录
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 知识点记录的更多相关文章
- MVC知识点记录
_Layout.cshtmlRenderSectionsection 分部页的使用@Html.Partial Html.RenderPartial与 Html.RenderAction的 return ...
- spring mvc开发过程知识点记录
给一个客户做的一个小项目,需求就是输入类似一个短网址http://dd.yy/xxxx然后跳转到另外一个域名下的图书文件.(实际很多短网址站都提供API供调用吧,不过客户需求是他自己建立一个短网址服务 ...
- C#知识点记录
用于记录C#知识要点. 参考:CLR via C#.C#并发编程.MSDN.百度 记录方式:读每本书,先看一遍,然后第二遍的时候,写笔记. CLR:公共语言运行时(Common Language Ru ...
- javascript知识点记录(1)
javascript一些知识点记录 1.substring,slice,substr的用法 substring 和slice 都有startIndex 和 endIndex(不包括endInex),区 ...
- JavaScript算法与数据结构知识点记录
JavaScript算法与数据结构知识点记录 zhanweifu
- DB知识点记录
DB知识点记录 分页 SqlServer:ROW_NUMBER () over (ORDER BY ID) AS RN, MySql:limit Oracle:ROWNUM AS RN 数据表的基本结 ...
- 【千纸诗书】—— PHP/MySQL二手书网站后台开发之知识点记录
前言:使用PHP和MySQL开发后台管理系统的过程中,发现有一些通用的[套路小Tip],这里集中记录一下.结合工作中ing的后台业务,我逐渐体会到:除了技术知识外.能使用户体验好的“使用流程设计”积累 ...
- 计算机二级C语言选择题错题知识点记录。
计算机二级C语言选择题错题知识点记录. 1,在数据流图中,用标有名字的箭头表示数据流.在程序流程图中,用标有名字的箭头表示控制流. 2,结构化程序设计的基本原则:自顶向下,逐步求精,模块化,限制使用g ...
- Spring MVC知识点整理
网上Spring MVC相关知识点的介绍已经有很多了,但是大部分文章都是介绍其中的一部分知识点. 本文希望能够向读者做一个基本整体的介绍,首先我们先来了解下Spring MVC的基础接口和组件. ...
随机推荐
- Caffe学习系列(3):视觉层(Vision Layers)及参数
所有的层都具有的参数,如name, type, bottom, top和transform_param请参看我的前一篇文章:Caffe学习系列(2):数据层及参数 本文只讲解视觉层(Vision La ...
- 跟我学习Storm_Storm主要特点
Storm拥有低延迟.高性能.分布式.可扩展.容错等特性,可以保证消息不丢失,消息处理严格有序.Storm的主要特点如下所示: 简单的编程模型.类似于MapReduce降低了并行批处理复杂性,Stor ...
- ViewModelLocator
ViewModelLocator 这里先鼓舞下士气,ViewModelLocator很简单,甚至可以去掉,它不是Mvvm必须的.在初学Mvvm时,一般都是使用NuGet安装 MvvmLight框架,总 ...
- 直流调速系统Modelica基本模型
为了便于在OpenModelica进行仿真,形成一个完整的仿真模型,没有使用第三方的库,参照了DrModelica的例程,按照Modelica库的开源模型定义了所用的基本元件模型. 首先给出一些基本类 ...
- 整合Apache与PHP教程
Apache下载安装完成后,PHP下载解压后,最重要的是如何将他们连接起来,就是整合到一起,让它们之间有联系,笔者根据自己多次配的经验和帮学弟学妹配时他们的理解程度整理了一个比较详细易理解的版本,下面 ...
- [网站公告]3月10日23:00-4:00阿里云SLB升级,会有4-8次连接闪断
大家好,阿里云将于3月10日23:00-4:00对负载均衡服务(SLB)做升级操作,升级期间SLB网络连接会有约4-8次闪断.由此给您带来麻烦,敬请谅解! 阿里云SLB升级公告内容如下: 尊敬的用户: ...
- Linux进程间通信之管道
1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共 ...
- js正则表单验证汇总,邮箱验证,日期验证,电话号码验证,url验证,信用卡验证,qq验证
本文主要汇总各种正则验证,很多都是转载,本人也会尽可能验证准确性,如有错误欢迎留言 //trim()方法在有些浏览器中不兼容,最好自己重写一下 String.prototype.trim=functi ...
- 1008win7与虚拟机中的linux共享文件的(详细)方法
转自http://jingyan.baidu.com/article/ca00d56c74dde4e99eebcfd2.html 好东西一起分享 win7与虚拟机中的linux共享文件的(详细)方法 ...
- SpringMVC学习--文件上传
简介 文件上传是web开发中常见的需求之一,springMVC将文件上传进行了集成,可以方便快捷的进行开发. springmvc中对多部件类型解析 在 页面form中提交enctype="m ...