中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.net core 中的注入模式有哪些

發布時間:2021-01-16 09:59:02 來源:億速云 閱讀:401 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關.net core 中的注入模式有哪些,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

服務生存期:ASP.NET Core 提供了一個內置的服務容器 IServiceProvider負責管理服務的生命周期,從被依賴注入容器創建開始(就是將服務注入到你要使用的類的構造函數中),然后框架負責創建依賴關系的實例,并在不再需要時對其進行處理(就是說等我們調用完服務時,容器會自己去對注入的服務進行釋放)。

IServiceProvider 怎么負責的呢?

// System.IServiceProvider
using System;

public interface IServiceProvider
{
 object GetService(Type serviceType);
}

可以看出是通過 GetService此接口的方法獲取提供服務的對象。那再走深一點找找,我們看看程序集 Microsoft.Extensions.DependencyInjection 是怎么提供這個容器的

//Microsoft.Extensions.DependencyInjection.IServiceProviderFactory<TContainerBuilder>
using Microsoft.Extensions.DependencyInjection;
using System;

public interface IServiceProviderFactory<TContainerBuilder>
{
 TContainerBuilder CreateBuilder(IServiceCollection services);

 IServiceProvider CreateServiceProvider(TContainerBuilder containerBuilder);
}

看到上面的IServiceProviderFactory 接口是不是很熟悉了,這個容器里會有一個 IServiceCollection(服務集合),那服務怎么加進入(實現)的呢

//Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions
using System;

private static IServiceCollection Add(IServiceCollection collection, Type serviceType, Type implementationType, ServiceLifetime lifetime)
{
 ServiceDescriptor item = new ServiceDescriptor(serviceType, implementationType, lifetime);
 collection.Add(item);
 return collection;
}

到這里,已經很清楚了,也已經接近我們今天的主題了,直接來吧

// Microsoft.Extensions.DependencyInjection.ServiceLifetime
public enum ServiceLifetime
{
 Singleton,
 Scoped,
 Transient
}

上面的枚舉里面就是提供了Singleton、Scoped 和 Transient 三種模式。去微軟的文檔里面看看,先了解一下這三種模式,在 ServiceCollectionServiceExtensions 就只有3個方法(有重載喲)

.net core 中的注入模式有哪些

從源碼里面絕對可以想到,這3個方法是繼承 IServiceCollection。好了,說說這三種模式先,畢竟實現我們不是很關心(關心就看文檔看源碼)

(1)Singleton 單一實例模式:單一實例對象對每個對象和每個請求都是相同的,可以說是不同客戶端不同請求都是相同的。

(2)Transient 暫時性模式:暫時性對象始終不同,無論是不是同一個請求(同一個請求里的不同服務)同一個客戶端,每次都是創建新的實例。

(3)Scoped作用域模式:作用域對象在一個客戶端請求中是相同的,但在多個客戶端請求中是不同的。(這句是文檔的原話,我覺得描述的很清晰)

什么時候用哪種模式?這個不大好說(希望這個可以成為討論點)

比如一下吧:

1、日志記錄器可以實現為單例,因為在整個生命周期內都可以只使用一個實例;

2、數據庫訪問上下文(DbContext)選擇 Scoped 的應該是最佳候選,因為 services.AddDbContext 默認就是 Scoped(哈哈哈);

3、如果需要利用深度依賴關系圖(a deep dependency graph)創建惟一對象,則可以考慮將該對象注冊為 transient 。

還有看看別人怎么說(對Scoped的描述,在理解上可能不大一樣,見仁見智了老鐵)

.net core 中的注入模式有哪些

還有一個stackoverflow 的

.net core 中的注入模式有哪些

按別人的經驗,可以作為參考參考:

.net core 中的注入模式有哪些

怎么驗證?請用 官方例子 運行一下看結果:

瀏覽器第一個tab頁面(第一個請求,可以認為是一個客戶端):

.net core 中的注入模式有哪些

瀏覽器第二個tab頁面(第二個請求,可以認為是另一個客戶端):

.net core 中的注入模式有哪些

上述就是小編為大家分享的.net core 中的注入模式有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

元谋县| 万全县| 通城县| 连云港市| 澳门| 新营市| 麻城市| 四川省| 德令哈市| 叙永县| 南郑县| 芒康县| 县级市| 思茅市| 海林市| 蓝山县| 翼城县| 昭平县| 曲阳县| 岱山县| 平顶山市| 阿克苏市| 利辛县| 松溪县| 樟树市| 中方县| 沅陵县| 开平市| 江陵县| 阿拉善左旗| 五河县| 姜堰市| 娄烦县| 英吉沙县| 天祝| 分宜县| 前郭尔| 谷城县| 灵丘县| 炎陵县| 杭锦旗|