有一种在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
这让我很难!文档(http://docs.autofac.org/en/latest/integration/mvc.html#enable-property-injection-for-action-filters)仍然提到属性注入,我想那些需要更新。 – Ali