IOC可以摒弃掉类中类的紧耦合,让设计和重用更简单,将IOC加入到MVC中的实现非常简单,那么有哪几种方法?它们的实现又是什么原理呢?

IOC在MVC中的注入,主要是在获取Controller对象中实现,也就是在获取Controller对象的方法中增加注入的相关实现就可以了,这些入口均是在DefaultControllerFactory类中,目前获取Controller的有如下方法:

(1)重写DefaultControllerFactory中的GetControllerInstance方法

源码:

  1. protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
  2. {
  3. if (controllerType == null)
  4. {
  5. throw new HttpException(,
  6. String.Format(
  7. CultureInfo.CurrentCulture,
  8. MvcResources.DefaultControllerFactory_NoControllerFound,
  9. requestContext.HttpContext.Request.Path));
  10. }
  11. if (!typeof(IController).IsAssignableFrom(controllerType))
  12. {
  13. throw new ArgumentException(
  14. String.Format(
  15. CultureInfo.CurrentCulture,
  16. MvcResources.DefaultControllerFactory_TypeDoesNotSubclassControllerBase,
  17. controllerType),
  18. "controllerType");
  19. }
  20. return ControllerActivator.Create(requestContext, controllerType);
  21. }

重写后:

  1. public class DefaultFactoryIOC:DefaultControllerFactory
  2. {
  3. private IKernel kernel;
  4. public DefaultFactoryIOC()
  5. {
  6. kernel = new StandardKernel();
  7. kernel.Bind<IRespo>().To<Respo>();
  8. }
  9. protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
  10. {
  11. return (IController)kernel.TryGet(controllerType);
  12. }
  13. }
  14. Global中定义
  15. ControllerBuilder.Current.SetControllerFactory(new IOCTest.DefaultFactoryIOC());

(2)对前面的方法再一次观察发现,实例化Controller最后是交给了ControllerActivator.Create(requestContext, controllerType)方法,也就是如果能够实现或者重写这个方法就能实现注入,那么ControllerActivator来自于

  1. public DefaultControllerFactory(IControllerActivator controllerActivator)
  2. : this(controllerActivator, null, null)
  3. {
  4. }

接下来实现IControllerActivator这个接口,完成第二种IOC方法

  1. public class ControllerActivatorIOC:IControllerActivator
  2. {
  3. private IKernel kernel;
  4. public ControllerActivatorIOC()
  5. {
  6. kernel = new StandardKernel();
  7. kernel.Bind<IRespo>().To<Respo>();
  8. }
  9. public IController Create(System.Web.Routing.RequestContext requestContext, Type controllerType)
  10. {
  11. return (IController)kernel.TryGet(controllerType);
  12. }
  13. }
  14. Global
  15. protected void Application_Start()
  16. {
  17. AreaRegistration.RegisterAllAreas();
  18.  
  19. /*DefaultFactoryController*/
  20. //ControllerBuilder.Current.SetControllerFactory(new IOCTest.DefaultFactoryIOC());
  21.  
  22. IControllerActivator controlleract = new IOCTest.ControllerActivatorIOC();
  23. DefaultControllerFactory defaultControllerFactory = new DefaultControllerFactory(controlleract);
  24. ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);
  25.  
  26. }

(3)接着最后一个方法仍然是从IControllerActivator 中,再DefaultContollerFactory这个Controller激活类中,默认调用实现IControllerActivator的类是DefaultControllerActivator,

它实现了以上这个Create方法

  1. private Func<IDependencyResolver> _resolverThunk;
    public IController Create(RequestContext requestContext, Type controllerType)
  2. {
  3. try
  4. {
  5. return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
  6. }
  7. catch (Exception ex)
  8. {
  9. throw new InvalidOperationException(
  10. String.Format(
  11. CultureInfo.CurrentCulture,
  12. MvcResources.DefaultControllerFactory_ErrorCreatingController,
  13. controllerType),
  14. ex);
  15. }
  16. }

从上可知,Create方法最后会采用那个默认的构造或者第三方实现_resolverThunk的类来实现,而这个_resolverThunk就是从IDependencyResolver接口而来,所以实现IDependencyResolver就可以达到DI的目的

  1. public class DependencyResolverIOC:IDependencyResolver
  2. {
  3. private IKernel kernel;
  4. public DependencyResolverIOC()
  5. {
  6. kernel = new StandardKernel();
  7. kernel.Bind<IRespo>().To<Respo>();
  8. }
  9. public object GetService(Type serviceType)
  10. {
  11. var obj = this.kernel.TryGet(serviceType);
  12. return obj;
  13. }
  14.  
  15. public IEnumerable<object> GetServices(Type serviceType)
  16. {
  17. return this.kernel.GetAll(serviceType);
  18. }
  19. }
  1. // Note: For instructions on enabling IIS6 or IIS7 classic mode,
  2. // visit http://go.microsoft.com/?LinkId=9394801
  3. public class MvcApplication : System.Web.HttpApplication
  4. {
  5. protected void Application_Start()
  6. {
  7. AreaRegistration.RegisterAllAreas();
  8.  
  9. /*DefaultFactoryController*/
  10. //ControllerBuilder.Current.SetControllerFactory(new IOCTest.DefaultFactoryIOC());
  11.  
  12. //IControllerActivator controlleract = new IOCTest.ControllerActivatorIOC();
  13. //DefaultControllerFactory defaultControllerFactory = new DefaultControllerFactory(controlleract);
  14. //ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);
  15.  
  16. DependencyResolver.SetResolver(new IOCTest.DependencyResolverIOC());
  17.  
  18. WebApiConfig.Register(GlobalConfiguration.Configuration);
  19. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  20. RouteConfig.RegisterRoutes(RouteTable.Routes);
  21. }
  22. }

IOC运用到MVC中的更多相关文章

  1. ASP.NET MVC中使用Unity Ioc Container

    写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始化 后记 关于Unity的使用可以参照<Unity依赖注入使用详解 ...

  2. IOC 在Mvc中的使用

    IOC 在Mvc中的使用 IOC,是控制反转(Inversion of Control)的英文简写, 控制反转一般分为两种类型,依赖注入(Dependency Injection)和依赖查找(Depe ...

  3. IOC 容器在 ASP.NET MVC 中的应用

    IOC 容器在 ASP.NET MVC 中的应用 IOC:Inversion Of Control 翻译为控制反转,我们在面向对象软件开发过程中,一个应用程序它的底层结构可能由N种不同的构件来相互协作 ...

  4. MVC中使用Unity Ioc Container

    ASP.NET MVC中使用Unity Ioc Container   写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始 ...

  5. 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, ...

  6. IOC容器-Autofac在MVC中实现json方式注入使用

    在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使 ...

  7. spring.Net之Ioc在MVC中的使用

    1.引入dll Common.Logging.dll Spring.Core.dll Spring.Web.dll Spring.Web.Extensions.dll Spring.Web.Mvc4. ...

  8. IoC之AutoFac(四)——AutoFac在MVC中的使用

    阅读目录 Mvc中使用Autofac 第一步:在mvc中添加dll文件,可以通过Nuget直接添加 第二步:在App_Start文件夹中添加一个AutofacConfig类 第三步:在Global.a ...

  9. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

随机推荐

  1. Java [Leetcode 190]Reverse Bits

    题目描述: everse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represente ...

  2. poj 3181 Dollar Dayz

    题意:给定一个数p,要求用K种币值分别为1,2,3...K的硬币组成p,问方案数,1,2,2和2,2,1算一种方案即与顺序无关,n <= 1000,k <= 100// 用完全背包做了 这 ...

  3. dbms_stats.gather_table_stats与analyze table 的区别[转贴]

    Analyze StatementThe ANALYZE statement can be used to gather statistics for a specific table, index ...

  4. 转载RabbitMQ入门(5)--主题

    主题(topic) (使用Java客户端) 在先前的指南中我们改进了我们的日志系统.取代使用fanout类型的交易所,那个仅仅有能力实现哑的广播,我们使用一个direct类型的交易所,获得一个可以有选 ...

  5. getDeclaredMethods()和getMethods()区别

    getDeclaredMethods()          返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共.保护.默认(包)访问和私有方法, ...

  6. gtid

    GTID的全称为 global transaction identifier,可以翻译为全局事务标示符,GTID在原始master上的事务提交时被创建.GTID需要在全局的主-备拓扑结构中保持唯一性, ...

  7. hdu 1573 x问题(中国剩余定理)HDU 2007-1 Programming Contest

    只是套模板而已(模板其实也不懂). 留着以后好好学的时候再改吧. 题意—— X = a[i] MOD b[i]; 已知a[i],b[i],求在[1, n]中存在多少x满足条件. 输入—— 第一行一个整 ...

  8. HDU5697 刷题计划 dp+最小乘积生成树

    分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog ...

  9. BLOCK专题

    >>定义并使用一个block    返回值(^名字)(参数列表) =^返回值类型(参数列表){表达式};  其中返回值和参数列表可以神略 ,最简单的block是  ^{xxxx}; voi ...

  10. BLOCK 死循环

    __weak typeof(self) weakSelf = self; myObj.myBlock =  ^{     __strong typeof(self) strongSelf = weak ...