2017-03-05 116 views
7

閱讀this後,我可以理解AddTransient,AddScoppedAddSingleton之間的差異,但是我無法看到它們中的每一個的實際用法。什麼是使用IServiceCollection.AddTransient,IServiceCollection.AddSingleton和IServiceCollectionAddScopped方法的實際場景?

我的理解是

AddTransient

創建一個新的實例每次當客戶需要它。

services.AddTransient<IDataAccess, DataAccess>(); 

每次客戶端代碼要求時都會返回一個新的DataAccess對象。更可能是一個構造函數。 AddTransient

使用的情況下,當我們需要訪問數據庫讀取和更新它,摧毀訪問對象(數據訪問),其最好用AddTransient - 不知道有關線程安。

AddScopped

創建爲每個HTTP Web請求一個新的實例。 AddScopped

使用

services.AddScoped<ShoppingCart>(serviceProvider => ShoppingCart.GetShoppingCart(serviceProvider)); 

這意味着每個Web請求將具有實習生意味着每個用戶/客戶端將是具有針對HTTP web請求自己的SHOPING車實例在其自己的購物車實例。

AddSingleton

所有的HTTP Web請求創建一個實例。 AddSingleton

使用發現在一個示例應用程序的代碼,但我不知道它是如何是有用的。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

可有人請給一個體面的實際例子時使用AddSingleton和檢查,如果我的AddTransient和AddScopped的理解是正確的?

回答

9

您對所有3個示波器的理解都是正確的。

當組件不能共享時,將使用瞬態。一個非線程安全的數據庫訪問對象就是一個例子。

作用域可用於實體框架數據庫上下文。主要原因是從數據庫獲取的實體將被附加到請求中的所有組件都會看到的相同的上下文。當然,如果您打算並行執行查詢,則不能使用Scoped。

Scoped對象的另一個例子是某種類型的RequestContext類,它包含例如調用者的用戶名。中間件/ MVC過濾器可以請求它並填寫信息,並且其他組件也可以請求它,並且它肯定會包含當前請求的信息。

Singleton組件總是共享的,所以它們最適合不需要綁定到請求的線程安全組件。一個例子是IOptions,它可以訪問配置設置。在單個靜態HttpClient實例上使用SendAsyncHttpClient包裝類也是完全線程安全的,並且是單身人士的理想人選。

請注意,如果您有一個依賴於Scoped組件的Singleton組件,它的依賴關係將在它之前被處置。因此,一個組件不能依賴於另一個比自己的範圍更小的組件。

+0

謝謝你Juunas,一個很好的解釋,但是,我期待一個具體的例子的答案 - 可能爲時尚早,要求。 –

相關問題