Istnieje nowy sposób rejestrowania globalnych filtrów MVC w AutoFac. Najpierw, usuń rejestrację filtra z twojego RegisterGlobalFilters
, ponieważ będziemy mieli uchwyt Autofac dodający je do naszych kontrolerów/akcji zamiast MVC.
Następnie zarejestrować swój pojemnik w następujący sposób:
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));
Należy zauważyć, że przekazując w klasie Controller
do rozszerzenia AsActionFilterFor()
mówimy AutoFac aby zastosować filtr do wszystkich klas, które wywodzą się z klasy Controller
(co , w MVC, wszystkie są kontrolerami). Ponieważ wywołujemy AsActionFilterFor()
bez żadnych argumentów, określamy również, że chcemy, aby filtr był stosowany do wszystkich akcji w określonych kontrolerach.Jeśli chcesz zastosować filtr do wybranej kontrolera i akcji, można użyć wyrażeń lambda tak:
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
.AsActionFilterFor<HomeController>(c => c.Index())
.InstancePerHttpRequest();
Jeśli akcja rozgrywa parametru, należy użyć słowa kluczowego default
celu określenia:
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
.AsActionFilterFor<HomeController>(c => c.Detail(default(int)))
.InstancePerRequest();
należy pamiętać, że trzeba użyć innej metody rozszerzenie na podstawie jakiego rodzaju filtr jesteś rejestracji, tutaj są obsługiwane typy filtrów:
- AsActionFilterFor
- AsAuthorizationFilterFor
- AsExceptionFilterFor
- AsResultFilterFor
To mnie tak mocno! Dokumenty (http://docs.autofac.org/en/latest/integration/mvc.html#enable-property-injection-for-action-filters) wciąż wspominają o wstrzyknięciu własności, myślę, że te muszą zostać zaktualizowane. – Ali