autofac.web通常是对Page或用户/自定义控件做属性注入

public class Article:System.Web.UI.Page
{public IArticleService ArticleService{get;set;} //PageLoad事件或其它代码地方直接调用ArticleService.Get....
}

1 安装autofac.web nuget方式

2 web.config中做配置

<configuration><system.web><httpModules><!-- This section is used for IIS6 --><addname="ContainerDisposal"type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"/><addname="PropertyInjection"type="Autofac.Integration.Web.Forms.PropertyInjectionModule, Autofac.Integration.Web"/></httpModules></system.web><system.webServer><!-- This section is used for IIS7 --><modules><addname="ContainerDisposal"type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"preCondition="managedHandler"/><addname="PropertyInjection"type="Autofac.Integration.Web.Forms.PropertyInjectionModule, Autofac.Integration.Web"preCondition="managedHandler"/></modules></system.webServer>
</configuration>

ContainerDisposalModule在页面释放请求结束时释放autofac创建的相关对象和autofacScope

PropertyInjectionModule 猜测这个是在页面创建后做依赖注入的。这里也可以用另一个类型UnsetPropertyInjectionModule,唯一的区别是若我们已经自己在构造函数中对依赖的属性赋值了,前者的方式是继续依赖注入,后者则不会。二者只能选其一

3 实现IContainerProviderAccessor

有时候我们想在代码中手动从容器中解析指定接口或类型,此时我们需要访问容器或生命周期(全局容器和生命周期请看相关文章),实现IContainerProviderAccessor的目的就是给我们提供一个访问容器或生命周期的一个点

autofac中通常让Global来实现这个接口

public class Global : HttpApplication, IContainerProviderAccessor
{// Provider that holds the application container.static IContainerProvider _containerProvider;// Instance property that will be used by Autofac HttpModules// to resolve and inject dependencies.public IContainerProvider ContainerProvider{get { return _containerProvider; }}protected void Application_Start(object sender, EventArgs e){// Build up your application container and register your dependencies.var builder = new ContainerBuilder();builder.RegisterType<SomeDependency>();// ... continue registering dependencies...// Once you're done registering things, set the container// provider up with your registrations._containerProvider = new ContainerProvider(builder.Build());}
}

这样我们在代码中可以访问全局容器或生命周期了

var cpa = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance;
var cp = cpa.ContainerProvider;
cp.RequestLifetime....//当前请求生命周期
cp.ApplicationContainer //全局容器

4.1 自动注入

public class Article:System.Web.UI.Page
{public IArticleService ArticleService{get;set;} //PageLoad事件或其它代码地方直接调用ArticleService.Get....
}

注意:若我们的用户控件也注册到了autofac,那么也会做依赖注入,但是若我们通过代码的方式或类似Repeater遍历创建的用户控件都不会做自动注入 ,此时可以参看下面的手动注入

4.2 手动注入

var cpa = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance;
var cp = cpa.ContainerProvider;
cp.RequestLifetime.InjectProperties(objectToSet);

4.3 选择性注入

有时候(比如讲autofac添加到现有的项目中),我们的有暴露的属性,但是有的我们需要注入 有的不需要注入 怎么办? 使用另一个注入HttpModule,配合Attribute来选择性注入

<configuration><system.web><httpModules><!-- This section is used for IIS6 --><addname="ContainerDisposal"type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"/><addname="AttributedInjection"type="Autofac.Integration.Web.Forms.AttributedInjectionModule, Autofac.Integration.Web"/></httpModules></system.web><system.webServer><!-- This section is used for IIS7 --><modules><addname="ContainerDisposal"type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"preCondition="managedHandler"/><addname="AttributedInjection"type="Autofac.Integration.Web.Forms.AttributedInjectionModule, Autofac.Integration.Web"preCondition="managedHandler"/></modules></system.webServer>
</configuration>

此时所有页面公开的属性默认情况下不会被注入,除非添加InjectPropertiesAttribute或InjectUnsetPropertiesAttribute,用户控件也一样

4.4 不使用HttpModule方式注入

HttpModule的方式对所有页面、所用用户控件都会做注入。若我们只想对部分页面做注入,可以通过定义基类Page的方式实现

protected void Page_PreInit(object sender, EventArgs e)
{var cpa = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance;var cp = cpa.ContainerProvider;cp.RequestLifetime.InjectProperties(this);
}

4.5 自定义依赖注入Module

定义一个HttpModule实现Autofac.Integration.Web.DependencyInjectionModule

protected abstract IInjectionBehaviour GetInjectionBehaviourForHandlerType(Type handlerType);

The returned IInjectionBehaviour can be one of the predefined NoInjection, PropertyInjection, or UnsetPropertyInjection properties; or a custom implementation of the IInjectionBehaviour interface.

转载于:https://www.cnblogs.com/jionsoft/p/8858870.html

.net autofac Web Forms相关推荐

  1. ASP.NET Web Forms - 网站导航(Sitemap 文件)

    [参考]ASP.NET Web Forms - 导航 ASP.NET 带有内建的导航控件. 网站导航 维护大型网站的菜单是困难而且费时的. 在 ASP.NET 中,菜单可存储在文件中,这样易于维护.文 ...

  2. ASP.NET2.0 - ASP.net MVC和ASP.net Web Forms

    ASP.NET MVC是一个新的编程模型,而不是替代ASP.NET Web Forms. http://weblogs.asp.net/shijuvarghese/archive/2008/07/09 ...

  3. asp.net webform 使用 html partial,ASP.NET Web Forms

    ASP.NET Web Forms - 教程 ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器脚本创建网页和网站的开发框架. ASP.NET 支持三种不同的开发模式: We ...

  4. 如何在 Web Forms 中引入依赖注入机制

    依赖注入技术就是将一个对象注入到一个需要它的对象中,同时它也是控制反转的一种实现,显而易见,这样可以实现对象之间的解耦并且更方便测试和维护,依赖注入的原则早已经指出了,应用程序的高层模块不依赖于低层模 ...

  5. VS2010与.NET4系列 16.ASP.NET 4 Web Forms 更加干净的HTML标记

    从今天开始会有几篇日志,介绍 ASP.NET 4 Web Forms 中的一些重要变化,即生成干净的.标准兼容的.CSS友好的标记.今天介绍对服务器控件向客户呈现"ID"属性的更好 ...

  6. 关于FP Spread for Web Forms 2.0.0.0

    最近一直在忙java相关的工作,很少时间涉足.net了,今天抽空看了一下FP Spread for Web Forms 2.0.0.0,整理出一个 安装序列号,由于没有安装VS,所以也不能测试是否正确 ...

  7. asp.net mvc 点滴 一 asp.net mvc vs asp.net web forms

    MVC模式是一个大家很熟悉的设计模式,微软的asp.net mvc framework是给asp.net web forms提供了一个可替换的asp.net方案. Models:Model对象是程序的 ...

  8. 艾伟_转载:VS 2010 和 .NET 4.0 系列之《在ASP.NET 4 Web Forms中实现URL导向》篇

    本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 ...

  9. ASP.NET Web Forms 转换至MVC开发

    作为.NET 阵营的网页开发人员几乎都是从ASP.NET Web Forms开始接触网页开发技术的,所在在这里主要介绍一下Web Forms与MVC的差异. 一.开发概念的转变 MVC既不是程序设计语 ...

最新文章

  1. QIIME 2用户文档. 9数据导出Exporting data(2018.11)
  2. [转] 中国的车祸为什么多?一个”海归”的亲身体验(转)
  3. 剑指offer——面试题7:重建二叉树
  4. 避坑!gulp-imagemin运行出问题
  5. Linux/Unix系统编程手册学习笔记
  6. 如何下载矢量道路路网电子地图
  7. 计算机桌面屏保字幕设置,win7系统屏保设置成字幕保护的操作方法
  8. CNVD-2022-10270/CNVD-2022-03672 向日葵RCE复现
  9. 2021秋招总结(器件方向转行数字IC设计)
  10. android分享微信获取资源失败怎么办,android 调用系统分享微信失败:获取资源失败...
  11. 逻辑上的“谬误”真的是我们应该所认为的错误吗?
  12. 【CF643D】Bearish Fanpages(set)(模拟)
  13. symfony配置文件之三:routing和路由配置
  14. 卡尔曼滤波器、扩展卡尔曼滤波器、无向卡尔曼滤波器的详细推导
  15. sqlyog导入数据的两种方式
  16. 程序员升职记-五种种说话套路
  17. My feelings
  18. 51单片机 11.0592MHz 产生115200 波特率
  19. 2014年中国移动游戏行业研究报告
  20. Office2003宏病毒——台湾No.1MacroVirus的运行

热门文章

  1. 【MongoDB】chunk too big to move的解决方案
  2. rundeck入门-初步操作
  3. Spring JDBC详解
  4. 2014 7-8月MoonCake新增功能更新
  5. Permission denied 故障
  6. 自制启动盘分享(30天倒计时)
  7. 几个常用的数据库连接字符串
  8. Yii获取当前url和域名
  9. 《潮流时装设计——世界顶级时装CAD制板技巧》——1.6 服装生产中各部位国际代号...
  10. 企业云桌面-02-安装第2台域控制器和第2台DNS服务器-012-DC02