asp.net-mvc – Autofac,MVC(带ActionFilters),Web.Forms – 依赖解析冲突
|
我有一个遗留的Web.Forms应用程序,部分重写为MVC. MVC部分使用autofac作为依赖注入容器. MVC部分定义了自定义过滤器: public class CustomActionFilter : ActionFilterAttribute
{
protected ILogger Logger { get; set; }
public CustomActionFilter(ILogger logger) { Logger = logger; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Logger.Log("OnActionExecuting");
}
}
在web.config中禁用Web.Forms集成时,它可以正常工作. Hovewer,当我尝试使用Web.Forms autofac集成时,我在autofac内部(stack trace)的某个地方得到了与AutofacFilterProvider相关的NullReferenceException. > Global.asax.cs:http://pastebin.com/437Tnp0t 请注意,CustomActionFilter注册为全局过滤器,因此它使用autofac注册: public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(DependencyResolver.Current.GetService<CustomActionFilter>());
}
}
我试过了: >为MVC和Web.Forms使用单独的容器 – 结果相同 所以,问题是,有没有办法为MVC和web.forms部分提供幕后依赖解析.我是autofac的新手,对于一般的依赖注入容器来说有点新,所以我可能会错过一些明显的东西. 更新:错误与自定义筛选器无关.如果删除对自定义过滤器的所有引用,则错误行为仍然相同,甚至是堆栈跟踪. 解决方法实际上有两个错误?在Autofac中导致此行为:错误#1:作为修复Issue 351的副作用,AutofacDependencyResolver需要在创建的Request绑定LifeTimeScopes中注册. MVC集成做到了这一点,但Winforms集成当然没有. 错误? #2:RequestLifetimeScopeProvider和ContainerProvider都使用相同的密钥HttpContext.Current.Items存储创建的ILifetimeScope: static ILifetimeScope LifetimeScope
{
get { return (ILifetimeScope)HttpContext.Current.Items[typeof(ILifetimeScope)]; }
set { HttpContext.Current.Items[typeof(ILifetimeScope)] = value; }
}
所以这里有一点竞争条件,因为取决于首先执行哪个模块,WebForms或MVC intergartion ILifetimeScope获胜.因此,如果WebForms模块获胜,则AutofacDependencyResolver将不会被注册,并且您将获得良好的非描述性异常. 修复/解决方法: 但是有一个简单的解决方法:您只需要在ContainerProvider requestLifetimeConfiguration中注册AutofacDependencyResolver,因此无论哪一个获胜(WebForm与MVC),AutofacDependencyResolver将始终注册: var autofacDependencyResolver = new AutofacDependencyResolver(container);
DependencyResolver.SetResolver(autofacDependencyResolver);
_containerProvider = new ContainerProvider(container,requestContainerBuilder =>
requestContainerBuilder.RegisterInstance(autofacDependencyResolver)
.As<AutofacDependencyResolver>()); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET中的会话修复
- asp.net-mvc – 使用Automapper更新现有的实体POCO
- asp.net-mvc – VS 2015:无法加载文件或程序集’System.We
- 解决ASP.NET中的后台任务中的Autofac组件
- asp.net – 自定义会话状态模块 – 使用ASP状态服务
- asp.net-web-api2 – ASP.NET 5(vNext)/ Web API / OAuth /
- asp.net-web-api – 尝试从asp.net web api自主主机中获取用
- asp.net – 使用Visual Studio 2017在.NET Core解决方案上没
- 使用ASP.NET会话状态服务器(而不是InProc)的优点和缺点?
- ASP.NET读取XML文件4种方法分析
