2017-04-27 8 views
6

ServiceFilter musimy zarejestrować w pliku Startup.cs. TypeFilter jest wstrzykiwany przez Microsoft.Extensions.DependencyInjection.ObjectFactory, nie musimy rejestrować tego filtru.ServiceFilter i TypeFilter - jaka jest różnica we wtrysku tych filtrów?

Więc kiedy powinniśmy użyć ServiceFilter i kiedy TypeFilter?

+0

Dokumentacja programu ASP.NET Core zawiera szczegółowe objaśnienia filtrów. Sprawdziłeś to? –

Odpowiedz

5

Ok, documentation:

  • ServiceFilter pobiera wystąpienie filtra z eteru. Użycie numeru ServiceFilter bez zarejestrowania typu filtru powoduje wyjątek.

  • TypeFilterAttribute jest bardzo podobny do ServiceFilterAttribute (a także realizuje IFilterFactory) ale jego typ nie jest rozwiązany bezpośrednio z pojemnika DI. Zamiast tego tworzy instancję typu przy użyciu Microsoft.Extensions.DependencyInjection.ObjectFactory.

Z powodu tej różnicy, typy, które są przywoływane za pomocą TypeFilterAttributenie muszą być zarejestrowani w pierwszej pojemnika (ale nadal będą musiały ich zależności spełnione przez kontener).

+0

Wiem, że - ale nadal nie widzę, kiedy powinienem używać ServiceFilter i kiedy powinienem użyć Typefilter. – MrChudz

+0

Więc czym dokładnie jest 'Microsoft.Extensions.DependencyInjection.ObjectFactory'? Jak to działa, jeśli nie zarejestrujesz go w kontenerze? –

2

Zarówno ServiceFilter, jak i TypeFilter są konstruowane przy użyciu iniekcji zależności.

Według this typeFilter jest tworzony przy użyciu Microsoft.Extensions.DependencyInjection.ObjectFactory co ostatecznie pozwala na zapewnienie sobie parametry konstruktora (Można zobaczyć Argumenty parametr w konstruktorze). Rozwiązuje również te, których nie podajesz.

Więc można zrobić coś takiego:

public class AttachMetadataAttribute : Attribute, IAsyncActionFilter 
{ 
    public AttachMetadataAttribute(SomeType someValue, ISomeService service) 
     { 
     } 
} 

i można użyć, że tak:

[TypeFilter(typeof(AttachMetadataAttribute), 
    IsReusable = true, 
    Order = 10, 
    Arguments = new object[] { someValue})] 

Więc tu pierwszy parametr (someValue) jest dostarczana przez ciebie i usługi zostanie wstrzyknięty przez pojemnik.

Uwaga: Ostrożnie o numerze IsReusable. Jeśli jest ustawiony na wartość true, wstrzyknięta usługa jest tworzona tylko raz.

Powiązane problemy