在不使用注入容器之前,我们的项目往往存在着大量耦合的类,这使得我们在开发大型项目时难以维护。比如下面这个简单的MVC框架的例子,计算购物车的产品价格总和:
最后view视图呈现的结果:
在该项目中依赖一些紧耦合的类:ShoppingCart类与LinqValueCalculator类是紧耦合的,而HomeController类与ShoppingCart和LinqValueCalculator都是紧耦合的。这意味着,如果想替换LinqValueCalculator类,就必须在与它有紧耦合关系的类中找到对它的引用,并修改。这对于一个实际项目中,就是一个乏味且易错的过程。
Ninject的出现就是要解决Home控制器和计算器类LinqValueCalculator之间耦合的问题
选择“工具”-》“库包管理器”-》“管理解决方案的NuGet包”-》打开“NuGet包”对话框,点击左侧面板的“在线”,在右上角的搜索框中输入“Ninject”,将会找到一系列的Ninject包。本人实际开发中,遇到搜索不到的情况,这时点击左下角的设置按钮,弹出设置的对话框,把图中的两个数据源都勾选上,再回来搜索就可以找到了。
示例要做的第一个修改就是创建一个自定义的依赖解析器。MVC框架需要使用依赖解析器来创建类的实例,以便对请求进行服务。
给项目添加一个名为InfraStructure的新文件夹,并添加一个名为NinjectDependencyResolver.cs的类。
该类分三步走
1)创建一个Ninject内核的实例StandardKernel,用它与Ninject进行通信;
2)应用实例的方法,建立程序中接口与实现类的绑定,Bind<.Type1>().To
3)实际使用Ninject,应用Get方法,告诉Get方法用户感兴趣的是哪个接口,即可创建该接口绑定的实例。
必须告诉MVC框架,用户希望使用自己的依赖解析器,通过修改Global.asax.cs文件来完成。
通过这里的添加语句,能让Ninject来创建MVC框架所需的任何对象实例,这便将DI放到了这一应用程序的内核中。
当要求Ninject创建一个类型时,它会检查该类与其他类之间的耦合。如果有额外依赖,Ninject会自动解析这些依赖,并创建所有类的实例。
在Models文件夹中添加一个Discount.cs的文件,如下:
DefaultDiscountHelper类实现了接口,并运用了固定的10%的折扣,此时修改LinqValueCalculator类,使其计算时使用该接口
再在自定义的依赖解析器里增加绑定
在把接口绑定到它的实现时,可以提供想要运用到属性上的一些属性细节,以便对Ninject创建的类进行配置。修改DefaultDiscountHelper类,以使它定义一个DiscountSize属性,该属性用于计算折扣量。
修改Ninject的绑定方法
结果:
还可以使用构造器来注入
只不过Ninject的绑定也要做想要的修改,**注意:这里传的是构造器的参数**
如果一个接口有多个不同的实现类,比如再多创建一个可以实现不同折扣的类
这时就要修改Ninject的绑定方法,告诉Ninject何时使用哪个类来实例化接口。
本例在适当的位置留下对IDiscountHelper的原有绑定,Ninject会尝试找出最佳匹配,而且这有助于对同一个类或接口采用一个默认绑定,以便在条件判断不能得到满足时,让Ninject能够进行回滚。
《精通ASP.NET MVC4》
手机扫一扫
移动阅读更方便
你可能感兴趣的文章