.net autofac Web Forms
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相关推荐
- ASP.NET Web Forms - 网站导航(Sitemap 文件)
[参考]ASP.NET Web Forms - 导航 ASP.NET 带有内建的导航控件. 网站导航 维护大型网站的菜单是困难而且费时的. 在 ASP.NET 中,菜单可存储在文件中,这样易于维护.文 ...
- 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 ...
- asp.net webform 使用 html partial,ASP.NET Web Forms
ASP.NET Web Forms - 教程 ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器脚本创建网页和网站的开发框架. ASP.NET 支持三种不同的开发模式: We ...
- 如何在 Web Forms 中引入依赖注入机制
依赖注入技术就是将一个对象注入到一个需要它的对象中,同时它也是控制反转的一种实现,显而易见,这样可以实现对象之间的解耦并且更方便测试和维护,依赖注入的原则早已经指出了,应用程序的高层模块不依赖于低层模 ...
- VS2010与.NET4系列 16.ASP.NET 4 Web Forms 更加干净的HTML标记
从今天开始会有几篇日志,介绍 ASP.NET 4 Web Forms 中的一些重要变化,即生成干净的.标准兼容的.CSS友好的标记.今天介绍对服务器控件向客户呈现"ID"属性的更好 ...
- 关于FP Spread for Web Forms 2.0.0.0
最近一直在忙java相关的工作,很少时间涉足.net了,今天抽空看了一下FP Spread for Web Forms 2.0.0.0,整理出一个 安装序列号,由于没有安装VS,所以也不能测试是否正确 ...
- asp.net mvc 点滴 一 asp.net mvc vs asp.net web forms
MVC模式是一个大家很熟悉的设计模式,微软的asp.net mvc framework是给asp.net web forms提供了一个可替换的asp.net方案. Models:Model对象是程序的 ...
- 艾伟_转载: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文件 ...
- ASP.NET Web Forms 转换至MVC开发
作为.NET 阵营的网页开发人员几乎都是从ASP.NET Web Forms开始接触网页开发技术的,所在在这里主要介绍一下Web Forms与MVC的差异. 一.开发概念的转变 MVC既不是程序设计语 ...
最新文章
- QIIME 2用户文档. 9数据导出Exporting data(2018.11)
- [转] 中国的车祸为什么多?一个”海归”的亲身体验(转)
- 剑指offer——面试题7:重建二叉树
- 避坑!gulp-imagemin运行出问题
- Linux/Unix系统编程手册学习笔记
- 如何下载矢量道路路网电子地图
- 计算机桌面屏保字幕设置,win7系统屏保设置成字幕保护的操作方法
- CNVD-2022-10270/CNVD-2022-03672 向日葵RCE复现
- 2021秋招总结(器件方向转行数字IC设计)
- android分享微信获取资源失败怎么办,android 调用系统分享微信失败:获取资源失败...
- 逻辑上的“谬误”真的是我们应该所认为的错误吗?
- 【CF643D】Bearish Fanpages(set)(模拟)
- symfony配置文件之三:routing和路由配置
- 卡尔曼滤波器、扩展卡尔曼滤波器、无向卡尔曼滤波器的详细推导
- sqlyog导入数据的两种方式
- 程序员升职记-五种种说话套路
- My feelings
- 51单片机 11.0592MHz 产生115200 波特率
- 2014年中国移动游戏行业研究报告
- Office2003宏病毒——台湾No.1MacroVirus的运行