2017-04-27 151 views
6

ServiceFilter我們必須在Startup.cs中註冊。 TypeFilter是由Microsoft.Extensions.DependencyInjection.ObjectFactory注入的,我們不需要註冊那個過濾器。ServiceFilter和TypeFilter - 注入這些過濾器有什麼區別?

那麼當我們應該使用ServiceFilter和TypeFilter時呢?

+0

ASP.NET核心文檔包含過濾器的詳細說明。你檢查過了嗎? –

回答

5

好了,所以documentation

  • ServiceFilter檢索來自DI過濾器的一個實例。使用ServiceFilter而不註冊過濾器類型會導致異常。

  • TypeFilterAttribute非常類似於ServiceFilterAttribute(和還實現IFilterFactory),但其類型不從DI容器直接解決。相反,它使用Microsoft.Extensions.DependencyInjection.ObjectFactory實例化類型。

由於存在這種差異,即使用TypeFilterAttribute不需要引用類型,以與容器第一進行登記(但他們仍然會已經由容器履行依賴)。

+0

我知道 - 但我仍然沒有看到何時應該使用ServiceFilter,何時使用Typefilter。 – MrChudz

+0

那麼究竟是什麼'Microsoft.Extensions.DependencyInjection.ObjectFactory'?如果您沒有在容器中註冊它,它將如何工作? –

2

ServiceFilter和TypeFilter都是使用依賴注入構造的。

根據this的TypeFilter使用Microsoft.Extensions.DependencyInjection.ObjectFactory這最終使您可以提供參數的構造函數實例化自己的(你可以看到它的構造函數的參數參數)。它也解決了你不提供的。

所以,你可以做這樣的事情:

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

而且你可以使用這樣的:

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

所以在這裏,由您和服務提供的第一個參數(someValue中)被容器注入。

注意:小心約IsReusable。如果設置爲true,則只會創建一次注入的服務。