gpt4 book ai didi

asp.net-mvc - Autofac、MVC(带有 ActionFilters)、Web.Forms - 依赖项解析冲突

转载 作者:行者123 更新时间:2023-12-01 22:09:36 25 4
gpt4 key购买 nike

我有一个旧版 Web.Forms 应用程序,已部分重写为 MVC。 MVC部分使用autofac作为依赖注入(inject)容器。

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 集成时,它可以正常工作。然而,当我尝试使用 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>());
}
}

我已经尝试过:

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

所以,问题是,有没有办法为 MVC 和 web.forms 部分提供幕后依赖解析。我对 autofac 很陌生,而且对一般的依赖注入(inject)容器也有些陌生,所以我可能会错过一些明显的东西。

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

最佳答案

实际上有两个错误?在 Autofac 中导致此行为:

错误 #1: 作为 Issue 351 修复的副作用AutofacDependencyResolver 需要在创建的请求绑定(bind) LifeTimeScope 中注册。 MVC 集成可以做到这一点,但 Winforms 集成当然不会。

错误? #2: RequestLifetimeScopeProviderContainerProvider 都使用相同的键 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-mvc - Autofac、MVC(带有 ActionFilters)、Web.Forms - 依赖项解析冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18340594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com