博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
依赖注入容器Autofac与MVC集成
阅读量:5998 次
发布时间:2019-06-20

本文共 2224 字,大约阅读时间需要 7 分钟。

Autofac是应用于.Net平台的依赖注入(DI,Dependency Injection)容器,具有贴近、契合C#语言的特点。随着应用系统的日益庞大与复杂,使用Autofac容器来管理组件之间的关系可以“扁平化”错综复杂的类依赖,具有很好的适应性和便捷度。

  在该篇博文中,我们将应用Autofac,以依赖注入的方式建立传统ASP.NET页面与服务/中间层之间的联系,建立“呈现”与“控制”的纽带。
  那么,如何将依赖注入(Dependency Injection)植入ASP.NET中呢?
  ASP.NET页面生命周期的整个过程均被ASP.NET工作者进程把持,这也就基本上切断了我们想在这个过程中通过“构造函数注入(Constructor injection)”的方式植入服务/中间层的念头,并且要求我们必须在进入页面生命周期之前完成这个植入的过程。基于这种考虑,我们可以采用IhttpModule基础之上“属性注入(Property injection)”方式。以下为实现细节:
  1、 引用相应dll
     

      下载Autofac,注意你下载的版本是否与你项目的.net版本一致

     

  向ASP.NET应用程序添加以下引用:
  Autofac.dll
  Autofac.Integration.Web.dll
     Autofac.Integration.Web.Mvc.dll

  2、 设置web.config
  接下来要修改web.config文件,新建一个HTTP模块,由于控制反转容器会动态初始化对象,所以该模块的目的就是适当的将建立的对象释放。
<configuration>
<system.web>
<httpModules>
<!--IIS6下设置 --> 

<httpModules>
      <add name=
"
ContainerDisposal
" type=
"
Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web
" />
    </httpModules> 
</system.web> 
<system.webServer> 

 

<!--IIS7 下设置-->

 <system.webServer>
    <modules>
      <add name=
"
ContainerDisposal
" type=
"
Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web
" />
    </modules>
    <validation validateIntegratedModeConfiguration=
"
false
" />
  </system.webServer>

  说明:
  ContainerDisposalModule,页面请求结束,Autofac释放之前创建的组件/服务。
  PropertyInjectionModule,在页面生命周期之前,向页面注入依赖项。

     3、修改Global.asax页面内容,在Application_Start事件里启用控制反转容器,让.net MVC能够与autofac集成

    

     由于使用autofac必须用到一些命名空间,必须添加以下引用

 

     
using System.Reflection;
     
using Autofac;
     
using Autofac.Integration.Web;
     
using Autofac.Integration.Web.Mvc;

 

     在MvcApplication类中设定IContainerProviderAccessor接口,并在类别层级添加以下代码

     

     
static IContainerProvider _containerProvider;
      
public IContainerProvider ContainerProvider
{
get { 
return _containerProvider; }

 

     在Application_Start方法中的最前面添加以下代码:

     

 
var builder = 
new ContainerBuilder();
            SetupResolveRules(builder);
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            _containerProvider = 
new ContainerProvider(builder.Build());
            ControllerBuilder.Current.SetControllerFactory(
new AutofacControllerFactory(_containerProvider));

 

    

  4、 页面属性获取服务/中间层
  在.aspx页面后台放置一公开的属性,用来接收服务/中间层。
// 用来接收服务/中间层的属性
public IEmpMng SomeDependency { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
lblEmp.Text = this.SomeDependency.selectOneEmp();
}

转载地址:http://xxwmx.baihongyu.com/

你可能感兴趣的文章
boke练习: springboot整合springSecurity出现的问题,post,delete,put无法使用
查看>>
WPF 海康威视网络摄像头回调方式实现断连提示,降低时延
查看>>
input输入框禁止显示历史记录
查看>>
正排索引(forward index)与倒排索引(inverted index)
查看>>
zookeeper频繁异常问题分析
查看>>
C#中的命名空间namespace与Java中的包package之间的区别
查看>>
JavaScript概念梳理
查看>>
数据分析 第八篇:OLS回归分析
查看>>
yum源安装php报错缺少libmcrypt.so.4()(64bit)库
查看>>
Winxp下 gvim 编程环境搭建
查看>>
三星Galaxy Note 4.0.3 N7000单刷PDA官方港版ROM下载(2012年5月15日发布)
查看>>
DB2 事务日志已满 增加事务日志文件;操作不记录日志
查看>>
matlab练习程序(Kruskal最小生成树)
查看>>
FileZilla 425 Can't open data connection
查看>>
分页sql
查看>>
Jquery获得服务器控件值的方法
查看>>
HDU 2795 Billboard
查看>>
POJ 2117 Electricity (割点)
查看>>
HDU 4618 Palindrome Sub-Array
查看>>
C++ 过载,重写,隐藏
查看>>