首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autofac,MVC (使用ActionFilters),Web.Forms -依赖解决冲突

Autofac,MVC (使用ActionFilters),Web.Forms -依赖解决冲突
EN

Stack Overflow用户
提问于 2013-08-20 16:44:10
回答 1查看 1.4K关注 0票数 6

我有一个遗留的Web.Forms应用程序,它被部分重写成MVC。MVC部分使用autofac作为依赖注入容器。

MVC部分定义了自定义过滤器:

代码语言:javascript
复制
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。

  • Global.asax.cs:http://pastebin.com/437Tnp0t
  • web.config:http://pastebin.com/5pU6SH6c

请注意,CustomActionFilter注册为全局筛选器,因此它是用autofac注册的:

代码语言:javascript
复制
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(DependencyResolver.Current.GetService<CustomActionFilter>());
    }
}

我试过:

  1. 对MVC和Web.Forms使用单独的容器-结果相同
  2. 使用属性注入而不是构造函数-相同的结果
  3. 显式触发web.forms页面上的依赖项解析(如this) -工作

因此,问题是,是否有任何方法来提供幕后依赖解决两者的MVC和web.forms部分。我对autofac很陌生,一般对依赖注入容器也有些新,所以我可能会错过一些显而易见的东西。

更新:错误与自定义过滤器无关。如果删除对自定义筛选器的所有引用,bug行为仍然相同,甚至堆栈跟踪也是如此。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-21 09:41:50

实际上有两个虫子?在导致此行为的Autofac中:

Bug #1:作为Issue 351修复的副作用,AutofacDependencyResolver需要在创建的请求绑定LifeTimeScope中注册。

Bug?#2: -- RequestLifetimeScopeProviderContainerProvider --用相同的键HttpContext.Current.Items存储创建的ILifetimeScope

代码语言:javascript
复制
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总是会被注册的:

代码语言:javascript
复制
var autofacDependencyResolver = new AutofacDependencyResolver(container);
DependencyResolver.SetResolver(autofacDependencyResolver);
_containerProvider = new ContainerProvider(container, requestContainerBuilder => 
     requestContainerBuilder.RegisterInstance(autofacDependencyResolver)
     .As<AutofacDependencyResolver>());
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18340594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档