IOC运用到MVC中
IOC可以摒弃掉类中类的紧耦合,让设计和重用更简单,将IOC加入到MVC中的实现非常简单,那么有哪几种方法?它们的实现又是什么原理呢?
IOC在MVC中的注入,主要是在获取Controller对象中实现,也就是在获取Controller对象的方法中增加注入的相关实现就可以了,这些入口均是在DefaultControllerFactory类中,目前获取Controller的有如下方法:
(1)重写DefaultControllerFactory中的GetControllerInstance方法
源码:
- protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
- {
- if (controllerType == null)
- {
- throw new HttpException(,
- String.Format(
- CultureInfo.CurrentCulture,
- MvcResources.DefaultControllerFactory_NoControllerFound,
- requestContext.HttpContext.Request.Path));
- }
- if (!typeof(IController).IsAssignableFrom(controllerType))
- {
- throw new ArgumentException(
- String.Format(
- CultureInfo.CurrentCulture,
- MvcResources.DefaultControllerFactory_TypeDoesNotSubclassControllerBase,
- controllerType),
- "controllerType");
- }
- return ControllerActivator.Create(requestContext, controllerType);
- }
重写后:
- public class DefaultFactoryIOC:DefaultControllerFactory
- {
- private IKernel kernel;
- public DefaultFactoryIOC()
- {
- kernel = new StandardKernel();
- kernel.Bind<IRespo>().To<Respo>();
- }
- protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
- {
- return (IController)kernel.TryGet(controllerType);
- }
- }
- Global中定义
- ControllerBuilder.Current.SetControllerFactory(new IOCTest.DefaultFactoryIOC());
(2)对前面的方法再一次观察发现,实例化Controller最后是交给了ControllerActivator.Create(requestContext, controllerType)方法,也就是如果能够实现或者重写这个方法就能实现注入,那么ControllerActivator来自于
- public DefaultControllerFactory(IControllerActivator controllerActivator)
- : this(controllerActivator, null, null)
- {
- }
接下来实现IControllerActivator这个接口,完成第二种IOC方法
- public class ControllerActivatorIOC:IControllerActivator
- {
- private IKernel kernel;
- public ControllerActivatorIOC()
- {
- kernel = new StandardKernel();
- kernel.Bind<IRespo>().To<Respo>();
- }
- public IController Create(System.Web.Routing.RequestContext requestContext, Type controllerType)
- {
- return (IController)kernel.TryGet(controllerType);
- }
- }
- Global中
- protected void Application_Start()
- {
- AreaRegistration.RegisterAllAreas();
- /*DefaultFactoryController*/
- //ControllerBuilder.Current.SetControllerFactory(new IOCTest.DefaultFactoryIOC());
- IControllerActivator controlleract = new IOCTest.ControllerActivatorIOC();
- DefaultControllerFactory defaultControllerFactory = new DefaultControllerFactory(controlleract);
- ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);
- }
(3)接着最后一个方法仍然是从IControllerActivator 中,再DefaultContollerFactory这个Controller激活类中,默认调用实现IControllerActivator的类是DefaultControllerActivator,
它实现了以上这个Create方法
- private Func<IDependencyResolver> _resolverThunk;
public IController Create(RequestContext requestContext, Type controllerType)- {
- try
- {
- return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
- }
- catch (Exception ex)
- {
- throw new InvalidOperationException(
- String.Format(
- CultureInfo.CurrentCulture,
- MvcResources.DefaultControllerFactory_ErrorCreatingController,
- controllerType),
- ex);
- }
- }
从上可知,Create方法最后会采用那个默认的构造或者第三方实现_resolverThunk的类来实现,而这个_resolverThunk就是从IDependencyResolver接口而来,所以实现IDependencyResolver就可以达到DI的目的
- public class DependencyResolverIOC:IDependencyResolver
- {
- private IKernel kernel;
- public DependencyResolverIOC()
- {
- kernel = new StandardKernel();
- kernel.Bind<IRespo>().To<Respo>();
- }
- public object GetService(Type serviceType)
- {
- var obj = this.kernel.TryGet(serviceType);
- return obj;
- }
- public IEnumerable<object> GetServices(Type serviceType)
- {
- return this.kernel.GetAll(serviceType);
- }
- }
- // Note: For instructions on enabling IIS6 or IIS7 classic mode,
- // visit http://go.microsoft.com/?LinkId=9394801
- public class MvcApplication : System.Web.HttpApplication
- {
- protected void Application_Start()
- {
- AreaRegistration.RegisterAllAreas();
- /*DefaultFactoryController*/
- //ControllerBuilder.Current.SetControllerFactory(new IOCTest.DefaultFactoryIOC());
- //IControllerActivator controlleract = new IOCTest.ControllerActivatorIOC();
- //DefaultControllerFactory defaultControllerFactory = new DefaultControllerFactory(controlleract);
- //ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);
- DependencyResolver.SetResolver(new IOCTest.DependencyResolverIOC());
- WebApiConfig.Register(GlobalConfiguration.Configuration);
- FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
- RouteConfig.RegisterRoutes(RouteTable.Routes);
- }
- }
IOC运用到MVC中的更多相关文章
- ASP.NET MVC中使用Unity Ioc Container
写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始化 后记 关于Unity的使用可以参照<Unity依赖注入使用详解 ...
- IOC 在Mvc中的使用
IOC 在Mvc中的使用 IOC,是控制反转(Inversion of Control)的英文简写, 控制反转一般分为两种类型,依赖注入(Dependency Injection)和依赖查找(Depe ...
- IOC 容器在 ASP.NET MVC 中的应用
IOC 容器在 ASP.NET MVC 中的应用 IOC:Inversion Of Control 翻译为控制反转,我们在面向对象软件开发过程中,一个应用程序它的底层结构可能由N种不同的构件来相互协作 ...
- MVC中使用Unity Ioc Container
ASP.NET MVC中使用Unity Ioc Container 写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始 ...
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
ADO.NET 一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data → DataTable, ...
- IOC容器-Autofac在MVC中实现json方式注入使用
在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使 ...
- spring.Net之Ioc在MVC中的使用
1.引入dll Common.Logging.dll Spring.Core.dll Spring.Web.dll Spring.Web.Extensions.dll Spring.Web.Mvc4. ...
- IoC之AutoFac(四)——AutoFac在MVC中的使用
阅读目录 Mvc中使用Autofac 第一步:在mvc中添加dll文件,可以通过Nuget直接添加 第二步:在App_Start文件夹中添加一个AutofacConfig类 第三步:在Global.a ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
随机推荐
- Java [Leetcode 190]Reverse Bits
题目描述: everse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represente ...
- poj 3181 Dollar Dayz
题意:给定一个数p,要求用K种币值分别为1,2,3...K的硬币组成p,问方案数,1,2,2和2,2,1算一种方案即与顺序无关,n <= 1000,k <= 100// 用完全背包做了 这 ...
- dbms_stats.gather_table_stats与analyze table 的区别[转贴]
Analyze StatementThe ANALYZE statement can be used to gather statistics for a specific table, index ...
- 转载RabbitMQ入门(5)--主题
主题(topic) (使用Java客户端) 在先前的指南中我们改进了我们的日志系统.取代使用fanout类型的交易所,那个仅仅有能力实现哑的广播,我们使用一个direct类型的交易所,获得一个可以有选 ...
- getDeclaredMethods()和getMethods()区别
getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共.保护.默认(包)访问和私有方法, ...
- gtid
GTID的全称为 global transaction identifier,可以翻译为全局事务标示符,GTID在原始master上的事务提交时被创建.GTID需要在全局的主-备拓扑结构中保持唯一性, ...
- hdu 1573 x问题(中国剩余定理)HDU 2007-1 Programming Contest
只是套模板而已(模板其实也不懂). 留着以后好好学的时候再改吧. 题意—— X = a[i] MOD b[i]; 已知a[i],b[i],求在[1, n]中存在多少x满足条件. 输入—— 第一行一个整 ...
- HDU5697 刷题计划 dp+最小乘积生成树
分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog ...
- BLOCK专题
>>定义并使用一个block 返回值(^名字)(参数列表) =^返回值类型(参数列表){表达式}; 其中返回值和参数列表可以神略 ,最简单的block是 ^{xxxx}; voi ...
- BLOCK 死循环
__weak typeof(self) weakSelf = self; myObj.myBlock = ^{ __strong typeof(self) strongSelf = weak ...