2017-04-27 49 views
6

ServiceFilter, Startup.cs'ye kayıt olmalıyız. TypeFilter, Microsoft.Extensions.DependencyInjection.ObjectFactory tarafından enjekte edilir, bu filtreyi kaydettirmemize gerek yoktur.ServiceFilter and TypeFilter - bu filtrelerin enjeksiyonundaki fark nedir?

ServiceFilter'i ne zaman ve ne zaman TypeFilter kullanılmalı?

+0

ASP.NET Çekirdek belgeleri, filtrelerin ayrıntılı açıklamalarını içerir. Kontrol ettin mi? –

cevap

5

Ok, documentation:

  • bir ServiceFilter DI filtrenin bir kopyasını alır. Filtre türünü kaydetmeden ServiceFilter'u kullanmak bir istisna oluşturur.

  • TypeFilterAttribute, (ve aynı zamanda IFilterFactory uygulayan) ServiceFilterAttribute çok benzer ancak türünü DI kabı şirketinden çözülmüş değildir. Bunun yerine, türü Microsoft.Extensions.DependencyInjection.ObjectFactory kullanarak başlatır. Bu farklılıklardan dolayı

, TypeFilterAttributegerekmez kullanılarak başvurulan tipleri ilk konteyner ile kayıtlı olması (ama yine de bağımlılıkları konteyner tarafından yerine getirmiş olur). Filtreniz kapsayıcıdan çözmeniz gereken bağımlılıklara sahipse, TypeFilterAttribute kullanın.

+0

Bunu biliyorum - ancak ServiceFilter'i ne zaman kullanmam gerektiğini ve ne zaman Typefilter kullanmam gerektiğini hala görmüyorum. – MrChudz

+0

Tam olarak Microsoft.Extensions.DependencyInjection.ObjectFactory nedir? Bu kapsayıcıyla kaydetmezseniz nasıl çalışır? –

2

Her iki ServiceFilter ve TypeFilter, bağımlılık enjeksiyonu kullanılarak oluşturulur.

this göre typeFilter sonuçta yapıcı sağlamamıza olanak tanır kendini parametreleri Microsoft.Extensions.DependencyInjection.ObjectFactory kullanılarak örneği (Bunu yapıcısına bir Argümanlar parametre görebilirsiniz). Sağlamadığınızları da çözer.

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

Ve böyle olduğu kullanabilirsiniz::

Yani böyle bir şey yapabileceği Yani burada birinci parametre (someValue) sağlanır siz ve servis tarafından

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

konteyner tarafından enjekte edilir.

Not: IsReusable konusunda dikkatli olun. Doğru olarak ayarlanmışsa, enjekte edilen servis sadece bir kez oluşturulur.