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);
}

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()
{
:创建一个Ninject的内核
IKernel ninject=new StandardKernel();
:就是配置Ninject内核,其实就是将实现类和接口类绑定在一起
ninject.Bind<ITest>().To<Test>();
:最后一步就是使用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就介绍到这了,如有不对,请多多包涵
												

最新文章

  1. js_继承
  2. 机器学习职位 &amp; 面经
  3. C#之Action
  4. Swift动画编程指南-02 Swift动画是怎么炼成的
  5. tachyon with spark
  6. 【Android】Android程序保护与破解浅析
  7. workflow4.0学习资料
  8. Cmake编译成静态库
  9. kali切换字符界面模式和切换图形界面模式
  10. ZOJ 2042 Divisibility (DP)
  11. android新闻App源码、仿微信源码、地图音乐源码等
  12. awk多分隔符功能及wc命令案列及企业级应用
  13. 0e开头的md5收集 --------PHP加密模块bug
  14. expect使用
  15. Git&amp;GitHub
  16. TCP 粘包问题浅析及其解决方案
  17. 手机App调试(Android)
  18. LTP(LinuxTest Project)测试工具
  19. 关于《阿里巴巴Java开发规约》插件的安装与使用
  20. Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LTS)

热门文章

  1. poj2002 哈希
  2. Linux下配置Squid基础教程
  3. jython awt demo
  4. 做raid1 经验总结
  5. codeforces111D. Petya and Coloring(组合数学,计数问题)
  6. PHP读取txt文件到数据库
  7. CSUOJ 1531 Jewelry Exhibition
  8. [Python] Execute a Python Script
  9. java架构解密——实时动态aop
  10. 转战Androidstudio之项目eclipse迁移