zoukankan      html  css  js  c++  java
  • ASP.NET没有魔法——ASP.NET MVC IoC代码篇

      上一篇文章主要以文字的形式介绍了IoC及其在ASP.NET MVC中的使用,本章将从以下几点介绍如何使用代码在ASP.NET MVC中实现依赖注入:
      ● AutoFac及安装
      ● 容器的创建
      ● 创建基于AutoFac的DependencyResolver
      ● 创建基于AutoFac的ControllerFactory

    AutoFac及安装

      Autofac是一个基于.Net的IoC容器,它用来管理类与类之间的依赖。Autofac提供了多种方法来将一个类型注册到容器中,也提供了构造注入、属性注入和方法注入等多种方式将依赖注入到实例中。
      本例将使用autofac作为依赖注入容器来实现ASP.NET MVC中的依赖注入功能。
      1. 通过Nuget在MyBlog项目下安装Autofac组件:

      

    容器的创建

      1. 创建前的准备:
      将PostController依赖的BlogManager修改为通过构造方法传入:

      

      2. 创建一个新的静态类型MyBlogContainer以及静态方法GetContainer来创建一个容器,并将BlogManager和PostController放入容器中:

      

      

    基于AutoFac的DependencyResolver

      ASP.NET MVC中的DependencyResolver不仅用于Controller的创建,而且在Controller也可以用它来从容器中获取组件。现在就创建一个自定义的DependencyResolver并替换默认的,使ASP.NET MVC能够从容器中获取之前放入容器的BlogManager以及PostController。
      1. 创建一个自定义的DependencyResolver:

      

      注:加入异常获取是因为不是所有的组件都被注册到容器中,当容器获取不存在的组件时就回抛出异常,这里如果没有找到组件就返回null,程序会调用其它方式去实例化组件,如使用 Activator.CreateInstance方法。
      2. 在Application_Start方法中调用容器的创建及解析器的替换:

      

      3. 运行程序,在文章列表页的断点中manager是可用的,证明Controller的有参构造已经成功调用:

      

      

    创建基于AutoFac的ControllerFactory

      ASP.NET MVC的Controller Factory前面的文章介绍过是用来创建Controller的,而ASP.NET MVC中有一个默认的控制器工厂类型DefaultControllerFactory。它创建Controller有两个主要步骤分别是Controller的类型获取(有缓存机制)以及Controller的创建(通过IControllerActivator)。
    要让ControllerFactory在创建Controller时从IoC容器获取那么只需要替换它的创建方法即可,也就是说要么替换IControllerActivator要么直接跳过IControllerActivator直接从容器创建,由于两种方法实现类似,所以本例仅实现跳过IControllerActivator的版本:
      1. 继承DefaultControllerFactory自定义新的ControllerFactory(由于还需要使用到Controller类型获取的环节,所以直接继承最为方便),重载受保护的GetControllerInstance即可,另外如果容器中找不到相应的Controller在继续调用基类的创建方法是为了保证其它没有注册到容器的Controller也能正确被创建:

      

      2. 在Application_Start方法中替换控制器工厂:

      

      3. 运行程序,程序同样能够正常工作:

      

      注:因为PostController被删除了无参构造方法,并且manager实例也需要在构造方法中赋值,所以如果不使用容器来创建Controller是会出错的如下:

      

      

    小结

      本文使用AutoFac实现了ASP.NET MVC中基于Dependency Resolver和基于ControllerFactory两种方式的依赖注入,用代码的形式验证了之前文章的分析。但需要注意的是以上代码仅仅是实验用的Demo,Autofac是一个相对复杂的IoC容器,要使用好它可以参考官方文档http://autofac.readthedocs.io/en/latest/getting-started/index.html 或等待后续文章介绍。
      关于ASP.NET MVC的两种依赖注入拓展方式并没有好坏之分,拓展方式的选择更多的是依赖实际情况来选择。

      另外本文虽然实现了依赖注入,当实际上没有使用依赖倒置原则DIP,换句话说PostController仍然依赖的是BlogManager这个实现,这样做是不合理的,关于MyBlog的代码会在后续文章中介绍如何重构。

    参考:
      http://autofac.readthedocs.io/en/latest/getting-started/index.html

    本文连接:http://www.cnblogs.com/selimsong/p/7698663.html 

    ASP.NET没有魔法——目录

  • 相关阅读:
    Markdown编辑器:Typora
    Makefile的编写
    【转】Java基础——成员变量、局部变量和静态变量的区别
    【转】jsp 和 servlet的联系和区别
    【转】keySet和entrySet的区别
    10月25日下午PHP静态、抽象、接口
    10月25日上午PHP继承多态
    10月24日下午PHP封装
    10月24日上午PHP面向对象
    MYSQL存储过程、游标、触发器
  • 原文地址:https://www.cnblogs.com/selimsong/p/7698663.html
Copyright © 2011-2022 走看看