我有一个遗留的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.Forms集成在web.config中禁用时,它可以很好地工作。Hovewer,当我尝试使用Web.Forms autofac集成时,我在autofac内部组件(stack trace)中找到了与AutofacFilterProvider相关的NullReferenceException。
请注意,CustomActionFilter注册为全局筛选器,因此它是用autofac注册的:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(DependencyResolver.Current.GetService<CustomActionFilter>());
}
}我试过:
因此,问题是,是否有任何方法来提供幕后依赖解决两者的MVC和web.forms部分。我对autofac很陌生,一般对依赖注入容器也有些新,所以我可能会错过一些显而易见的东西。
更新:错误与自定义过滤器无关。如果删除对自定义筛选器的所有引用,bug行为仍然相同,甚至堆栈跟踪也是如此。
发布于 2013-08-21 09:41:50
实际上有两个虫子?在导致此行为的Autofac中:
Bug #1:作为Issue 351修复的副作用,AutofacDependencyResolver需要在创建的请求绑定LifeTimeScope中注册。
Bug?#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互操作ILifetimeScope获胜。因此,如果WebForms模块获胜,AutofacDependencyResolver将不会被注册,您将得到一个很好的非描述性异常。
Fix/workaround:
但是有一个简单的解决方法:您只需要在AutofacDependencyResolver requestLifetimeConfiguration中注册这个AutofacDependencyResolver,所以无论哪一个人获胜(WebForm vs. ),AutofacDependencyResolver总是会被注册的:
var autofacDependencyResolver = new AutofacDependencyResolver(container);
DependencyResolver.SetResolver(autofacDependencyResolver);
_containerProvider = new ContainerProvider(container, requestContainerBuilder =>
requestContainerBuilder.RegisterInstance(autofacDependencyResolver)
.As<AutofacDependencyResolver>());https://stackoverflow.com/questions/18340594
复制相似问题