![](/img/trans.png)
[英]Asp.net Core dependency injection in filters without [ServiceFilter] or [TypeFilter]
[英]ServiceFilter and TypeFilter - what is the difference in injection those filters?
我們必須在Serviceup.cs中注冊ServiceFilter。 TypeFilter是由Microsoft.Extensions.DependencyInjection.ObjectFactory注入的,我們不需要注冊該過濾器。
那么什么時候應該使用ServiceFilter和何時使用TypeFilter?
根據Pro ASP.NET Core MVC 2的書。 第19章: 過濾器 ,第615頁
使用TypeFilter屬性時,將為每個請求創建過濾器類的新實例。 這與將過濾器直接用作屬性的行為相同,不同之處在於TypeFilter屬性允許過濾器類聲明通過服務提供者解析的依賴項。 ServiceFilter屬性更進一步,並使用服務提供者來創建過濾器對象。 這也允許將過濾器對象置於生命周期管理下。
區別由於ServiceFilter
使用ServiceProvider
來解決所涉及的篩選器實例,因此您可以控制在啟動類中注冊的篩選器的生命周期:
services.AddSingleton<TimeFilter>();
從上面的代碼行中,將僅為MVC應用程序生命周期創建一次TimeFilter
(而不是為每個http請求生命周期或當客戶要求時)創建一次,以便為所有http請求提供服務,而使用TypeFilter
是不可能的,因為存在您無法指示MVC框架何時實例化和配置TypeFilter
下使用的過濾器。
如果將過濾器注冊為Singleton
則僅創建該過濾器的一個實例,這意味着CLR的工作量減少,這與TypeFilter
為每個http請求創建過濾器類的新實例的情況不同。
用法假設您將TypeFilter
應用於兩個操作方法,對於每個HTTP請求,將創建該TypeFilter
的新實例,將調用構造函數並注入依賴項(您可以使用Service Provider
控制依賴項的生命周期Service Provider
)。 相反,使用ServiceFilter
可以確定其Singleton
還是Scoped
或Transient
。 如果其為Singleton
則僅為所有請求創建一個實例。
要記住的關鍵
我們要使用ServiceFilter
和Service Provider
來管理過濾器類型的生命周期。 如果過濾器具有依賴項,則我們已經像平常一樣使用Service Provider
管理它。
好的,所以文檔 :
ServiceFilter
從DI檢索過濾器的實例。 在未注冊過濾器類型的情況下使用ServiceFilter
導致異常。
TypeFilterAttribute
與ServiceFilterAttribute
非常相似(並且也實現IFilterFactory), 但是不能直接從DI容器解析其類型 。 而是使用Microsoft.Extensions.DependencyInjection.ObjectFactory
實例化類型。由於存在這種差異,使用
TypeFilterAttribute
引用的類型不需要先在容器中注冊 (但它們仍將由容器來滿足其依賴關系)。
ServiceFilter和TypeFilter都是使用依賴項注入構造的。
根據該對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,則注入的服務僅創建一次。
如果您的過濾器具有需要從容器中解析的依賴項,請使用TypeFilterAttribute
。 它允許您執行構造函數注入 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.