Asp.net mvc 4 正确的全局操作筛选器注册

Asp.net mvc 4 正确的全局操作筛选器注册,asp.net-mvc-4,autofac,Asp.net Mvc 4,Autofac,如何使用AutoFac注册全局操作筛选器? 通常建议的方法(如下所列)似乎不正确,因为一旦应用程序启动,所有依赖关系图都已初始化,操作筛选器就会被解析。但是,如果操作筛选器使用任何一次性对象(如DB session非直接而是通过服务层),则其工作方式不正确,因为全局筛选器只创建一次,并且始终有效,并且不会使用依赖服务重新创建 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { var use

如何使用AutoFac注册全局操作筛选器?
通常建议的方法(如下所列)似乎不正确,因为一旦应用程序启动,所有依赖关系图都已初始化,操作筛选器就会被解析。但是,如果操作筛选器使用任何一次性对象(如DB session非直接而是通过服务层),则其工作方式不正确,因为全局筛选器只创建一次,并且始终有效,并且不会使用依赖服务重新创建

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    var userLocatorFilter = ContainerHolder.Container.Resolve<UserLocatorAttribute>();
    var userStatusFilter = ContainerHolder.Container.Resolve<UserStatusAttribute>();
    var logErrorFilter = ContainerHolder.Container.Resolve<LogErrorAttribute>();
    // or DependencyResolver.Current.GetService<CustomFilterAttribute>()

    filters.Add(userLocatorFilter);
    filters.Add(userStatusFilter);
    filters.Add(logErrorFilter);
}
publicstaticvoidregisterglobalfilters(GlobalFilterCollection过滤器)
{
var userLocatorFilter=ContainerHolder.Container.Resolve();
var userStatusFilter=ContainerHolder.Container.Resolve();
var logErrorFilter=ContainerHolder.Container.Resolve();
//或DependencyResolver.Current.GetService()
filters.Add(userLocatorFilter);
filters.Add(userStatusFilter);
filters.Add(logErrorFilter);
}
因此,我想知道是否有任何类型的全局过滤器注册/解析过程会在每次请求时重新创建/处理它?换句话说,应该有一个寿命有限的全局过滤器

如果您需要更详细的问题说明,请告诉我。

如果您使用:

DependencyResolver.SetResolver(新的AutofacDependencyResolver(容器))

。。。当您需要过滤器时,您不能在过滤器中使用
DependencyResolver.Current.GetService()

另一种可能的解决方案可能是将Autofac
容器作为单个c'tor依赖项传递,然后您可以从中在单独的
生命周期内解析所需的服务


我不确定,但看到的是
ContainerHolder.Container
我想知道您使用的是哪个版本的Autofac-您看过版本3和那里的吗?

ContainerHolder
是我用于存储Autofac容器的自定义静态类。是的,因此我使用了和你建议的类似的解决方案,但不知道是否有更好的解决方案。