Ответ 1
Появился новый способ регистрации глобальных фильтров MVC в AutoFac. Во-первых, удалите регистрацию фильтра с вашего 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()
без каких-либо аргументов, мы также указываем, что хотим, чтобы фильтр применялся ко всем действиям в указанных контроллерах. Если вы хотите применить свой фильтр к выбранному контроллеру и действию, вы можете использовать лямбда-выражения так:
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