簡體   English   中英

ServiceFilter和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還是ScopedTransient 如果其為Singleton則僅為所有請求創建一個實例。

要記住的關鍵

我們要使用ServiceFilterService Provider來管理過濾器類型的生命周期。 如果過濾器具有依賴項,則我們已經像平常一樣使用Service Provider管理它。

好的,所以文檔

  • ServiceFilter從DI檢索過濾器的實例。 在未注冊過濾器類型的情況下使用ServiceFilter導致異常。

  • TypeFilterAttributeServiceFilterAttribute非常相似(並且也實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM