1

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

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);
}

所以我想知道是否有任何类型的全局过滤器注册/解析过程会在每个请求左右重新创建/处理它?换句话说,应该有生命周期有限的全局过滤器。

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

4

1 回答 1

0

如果您使用:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

...您不能DependencyResolver.Current.GetService<MyService>()在需要时在内部使用过滤器吗?

另一种可能的解决方案可能是将 AutofacContainer作为单个 c'tor 依赖项传递,然后您可以从中解析所需的服务LifetimeScope

我不确定,但是看到ContainerHolder.Container我想知道您使用的是哪个版本的 Autofac - 您是否看过版本 3 和MVC 集成

于 2014-01-22T14:39:37.950 回答