ServiceFilter我們必須在Startup.cs中註冊。 TypeFilter是由Microsoft.Extensions.DependencyInjection.ObjectFactory注入的,我們不需要註冊那個過濾器。ServiceFilter和TypeFilter - 注入這些過濾器有什麼區別?
那麼當我們應該使用ServiceFilter和TypeFilter時呢?
ServiceFilter我們必須在Startup.cs中註冊。 TypeFilter是由Microsoft.Extensions.DependencyInjection.ObjectFactory注入的,我們不需要註冊那個過濾器。ServiceFilter和TypeFilter - 注入這些過濾器有什麼區別?
那麼當我們應該使用ServiceFilter和TypeFilter時呢?
好了,所以documentation:
甲
ServiceFilter
檢索來自DI過濾器的一個實例。使用ServiceFilter
而不註冊過濾器類型會導致異常。
TypeFilterAttribute
非常類似於ServiceFilterAttribute
(和還實現IFilterFactory),但其類型不從DI容器直接解決。相反,它使用Microsoft.Extensions.DependencyInjection.ObjectFactory
實例化類型。由於存在這種差異,即使用
TypeFilterAttribute
不需要引用類型,以與容器第一進行登記(但他們仍然會已經由容器履行依賴)。
我知道 - 但我仍然沒有看到何時應該使用ServiceFilter,何時使用Typefilter。 – MrChudz
那麼究竟是什麼'Microsoft.Extensions.DependencyInjection.ObjectFactory'?如果您沒有在容器中註冊它,它將如何工作? –
如果您的過濾器具有需要從容器中解析的依賴項,請使用TypeFilterAttribute
。它允許你to perform constructor injection。
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,則只會創建一次注入的服務。
ASP.NET核心文檔包含過濾器的詳細說明。你檢查過了嗎? –