J0H*_*0HN 6 asp.net-mvc webforms autofac
我有一个遗留的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");
}
}
Run Code Online (Sandbox Code Playgroud)
在web.config中禁用Web.Forms集成时,它可以正常工作.Hovewer,当我尝试使用Web.Forms autofac集成时,我得到了与AutofacFilterProviderautofac内部(堆栈跟踪)中某处相关的NullReferenceException .
注意,它CustomActionFilter被注册为全局过滤器,因此它在autofac中注册:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(DependencyResolver.Current.GetService<CustomActionFilter>());
}
}
Run Code Online (Sandbox Code Playgroud)
我试过了:
所以,问题是,有没有办法为MVC和web.forms部分提供幕后依赖解析.我是autofac的新手,对于一般的依赖注入容器来说有点新,所以我可能会错过一些明显的东西.
更新:错误与自定义筛选器无关.如果删除对自定义过滤器的所有引用,则错误行为仍然相同,甚至是堆栈跟踪.
实际上有两个错误?在Autofac中导致此行为:
错误#1:作为修复问题351的副作用,AutofacDependencyResolver需要在创建的请求绑定中注册LifeTimeScope.MVC集成做到了这一点,但Winforms集成当然没有.
错误?#2:无论是RequestLifetimeScopeProvider和ContainerProvider存储创建ILifetimeScope具有相同的键HttpContext.Current.Items:
static ILifetimeScope LifetimeScope
{
get { return (ILifetimeScope)HttpContext.Current.Items[typeof(ILifetimeScope)]; }
set { HttpContext.Current.Items[typeof(ILifetimeScope)] = value; }
}
Run Code Online (Sandbox Code Playgroud)
所以这里有一点竞争条件,因为取决于首先执行哪个模块,WebForms或MVC intergartion ILifetimeScope获胜.因此,如果WebForms模块获胜,AutofacDependencyResolver则不会注册,并且您将获得良好的非描述性异常.
修复/解决方法:
但是有一个简单的解决方法:你只需要注册就可以了AutofacDependencyResolver,ContainerProvider requestLifetimeConfiguration无论哪一个获胜(WebForm vs. MVC)AutofacDependencyResolver都将永远注册:
var autofacDependencyResolver = new AutofacDependencyResolver(container);
DependencyResolver.SetResolver(autofacDependencyResolver);
_containerProvider = new ContainerProvider(container, requestContainerBuilder =>
requestContainerBuilder.RegisterInstance(autofacDependencyResolver)
.As<AutofacDependencyResolver>());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1253 次 |
| 最近记录: |