2012-11-12 16 views
26

Mam filtr jak ten:Rejestruj globalne filtry w ASP.NET MVC 4 i Autofac

public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter 
{ 
    public MyPropery Property { get; set; } 
    .... 
} 

potrzeba mi to do uruchomienia na każde działania w moim projekcie

Próbowałem go zarejestrować w GlobalFilters ale moja własność nie zostanie wstrzyknięty

próbowałem This solution aby zarejestrować filtr ale nie sprawdzony

Każdy pomysł, w jaki sposób to zrobić?

Odpowiedz

40

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
+1

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

15

Powinieneś teraz użyć rozwiązania Pete'a, aby to zrobić. Dzięki niemu za zaktualizowane rozwiązanie.

I wreszcie udało, oto jak to zrobić:

Najpierw utwórz swój atrybut z konstruktora ze wszystkimi zależnościami

public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter 
{ 
    private IProperty _property; 

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

Zarejestruj wszystko, czego potrzeba w autofac

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)); 

Zarejestruj swój globalny filtr w ten sposób:

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

Upewnij się, że w swoim pliku global.asax rejestrujesz najpierw Autofac, a następnie filtry globalne.

Teraz już nie potrzebujesz zastrzyku własnościowego, zastrzyk konstruktora sprawdzi się dobrze, co jest dobre!

+0

Jak uzyskać argument filtry GlobalFilterCollection które są potrzebne do wywołania metody statycznej w Global.asax? Czy coś przeoczyłem? –

+0

Nieważne, widzę FilterConfig.RegisterGlobalFilters w metodzie Application Start. –

+5

To nie działa, jeśli potrzebujesz zależności zależnej od każdego żądania. – ischell

Powiązane problemy