Asp.net mvc 4 正确的全局操作筛选器注册
如何使用AutoFac注册全局操作筛选器?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
通常建议的方法(如下所列)似乎不正确,因为一旦应用程序启动,所有依赖关系图都已初始化,操作筛选器就会被解析。但是,如果操作筛选器使用任何一次性对象(如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容器的自定义静态类。是的,因此我使用了和你建议的类似的解决方案,但不知道是否有更好的解决方案。