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 – RazorGenerator没有生成正确的命名空间
- asp.net – 自我跟踪实体vs POCO实体
- asp.net-mvc – Asp.net内核MVC post参数始终为null
- ASP.NET Core中返回 json 数据首字母大小写问题
- asp.net-mvc-4 – SignalR维护浏览器刷新时的连接ID
- asp.net-mvc – 如何将复选框绑定到视图模型的List属性?
- 为什么这个ASP.Net Code-behind中的if语句不起作用?
- 获得一个字符串的汉语拼音码
- asp.net-mvc-3 – 使用MVC3中的模型绑定ListBox
- asp.net-mvc – asp.net mvc中HttpUnauthorizedResult上的默
- ASP.NET网络表单的Nancy路由
- 拦截ASP.NET MVC框架中的请求
- asp.net-core – 当我们执行“kpm restore”时存
- asp.net – 如何处理错误时使用jQuery.ajax()?
- asp.net – 将mvc应用程序发布到Web服务器后无法
- Response.Redirect在ASP.NET中将数据POST到另一个
- asp.net-mvc – HandleError属性没有任何效果
- asp.net-mvc – 在视图中找不到webgrid引用
- asp.net-mvc-3 – MVC3:不将属性映射到DB列的属
- asp.net-mvc – ASP.NET MVC身份默认实现