有一种在 AutoFac 中注册 MVC 全局过滤器的新方法。首先,从您的过滤器注册中删除RegisterGlobalFilters
,因为我们将使用 Autofac 处理将它们添加到我们的控制器/操作而不是 MVC。
然后,按如下方式注册您的容器:
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 表达式,如下所示:
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
.AsActionFilterFor<HomeController>(c => c.Index())
.InstancePerHttpRequest();
如果您的操作带有参数,请使用default
关键字指定:
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
.AsActionFilterFor<HomeController>(c => c.Detail(default(int)))
.InstancePerRequest();
请注意,您必须根据您注册的过滤器类型使用不同的扩展方法,以下是支持的过滤器类型:
- AsActionFilterFor
- AsAuthorizationFilterFor
- AsExceptionFilterFor
- AsResultFilterFor