在ASP.Net MVC 4和Autofac中注册全局过滤器

Register global filters in ASP.Net MVC 4 and Autofac

我有一个这样的过滤器:

1
2
3
4
5
public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter
{
    public MyPropery Property { get; set; }
    ....
}

我需要为项目中的每个操作运行它

我试图在GlobalFilters中注册它,但是我的属性没有被注入

我尝试了此解决方案来注册我的过滤器,但未调用

关于如何做到这一点的任何想法?


有一种在AutoFac中注册MVC全局过滤器的新方法。首先,从您的RegisterGlobalFilters中删除过滤器注册,因为我们将使用Autofac句柄将它们添加到我们的控制器/操作中,而不是MVC。

然后,按如下所示注册您的容器:

1
2
3
4
5
6
7
8
9
10
11
12
13
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());

builder.RegisterType<MyProperty>().As<IProperty>();

builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
                .AsActionFilterFor<Controller>().InstancePerHttpRequest();

builder.RegisterFilterProvider();

IContainer container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

请注意,通过将Controller类传递到扩展名AsActionFilterFor()中,我们告诉AutoFac将此过滤器应用于从Controller类派生的所有类(在MVC中为所有控制器)。由于我们在调用AsActionFilterFor()时不带任何参数,因此我们还指定要将过滤器应用于指定控制器内的所有操作。如果要将过滤器应用于选择控制器和操作,则可以使用lambda表达式,如下所示:

1
2
3
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
    .AsActionFilterFor<HomeController>(c => c.Index())
    .InstancePerHttpRequest();

如果您的操作采用参数,请使用default关键字指定:

1
2
3
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
    .AsActionFilterFor<HomeController>(c => c.Detail(default(int)))
    .InstancePerRequest();

请注意,您必须根据要注册的过滤器类型使用不同的扩展方法,以下是受支持的过滤器类型:

  • AsActionFilterFor
  • AsAuthorizationFilterFor
  • AsExceptionFilterFor
  • AsResultFilterFor


您现在应该立即使用Pete的解决方案来执行此操作。感谢他提供了更新的解决方案。

我终于做到了,这是怎么做:

首先使用具有所有依赖项的构造函数创建属性

1
2
3
4
5
6
7
8
9
10
public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter
{
    private IProperty _property;

    public CustomFilterAttribute(IProperty repository)
    {
        _property = property;
    }
    ....
 }

在autofac中注册所需的一切

1
2
3
4
5
6
7
8
9
10
11
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());

builder.RegisterType<MyProperty>().As<IProperty>();
builder.RegisterType<CustomFilterAttribute>().SingleInstance();

builder.RegisterFilterProvider();

IContainer container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

像这样注册您的全局过滤器

1
2
3
4
5
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(DependencyResolver.Current.GetService<CustomFilterAttribute>());
}

确保在global.asax中先注册Autofac,然后注册全局过滤器。

现在,您不再需要属性注入,构造函数注入将可以正常工作,这是一件好事!