溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-01-16 09:59:02 來(lái)源:億速云 閱讀:399 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān).net core 中的注入模式有哪些,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

服務(wù)生存期:ASP.NET Core 提供了一個(gè)內(nèi)置的服務(wù)容器 IServiceProvider負(fù)責(zé)管理服務(wù)的生命周期,從被依賴(lài)注入容器創(chuàng)建開(kāi)始(就是將服務(wù)注入到你要使用的類(lèi)的構(gòu)造函數(shù)中),然后框架負(fù)責(zé)創(chuàng)建依賴(lài)關(guān)系的實(shí)例,并在不再需要時(shí)對(duì)其進(jìn)行處理(就是說(shuō)等我們調(diào)用完服務(wù)時(shí),容器會(huì)自己去對(duì)注入的服務(wù)進(jìn)行釋放)。

IServiceProvider 怎么負(fù)責(zé)的呢?

// System.IServiceProvider
using System;

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

可以看出是通過(guò) GetService此接口的方法獲取提供服務(wù)的對(duì)象。那再走深一點(diǎn)找找,我們看看程序集 Microsoft.Extensions.DependencyInjection 是怎么提供這個(gè)容器的

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

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

 IServiceProvider CreateServiceProvider(TContainerBuilder containerBuilder);
}

看到上面的IServiceProviderFactory 接口是不是很熟悉了,這個(gè)容器里會(huì)有一個(gè) IServiceCollection(服務(wù)集合),那服務(wù)怎么加進(jìn)入(實(shí)現(xiàn))的呢

//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;
}

到這里,已經(jīng)很清楚了,也已經(jīng)接近我們今天的主題了,直接來(lái)吧

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

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

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

從源碼里面絕對(duì)可以想到,這3個(gè)方法是繼承 IServiceCollection。好了,說(shuō)說(shuō)這三種模式先,畢竟實(shí)現(xiàn)我們不是很關(guān)心(關(guān)心就看文檔看源碼)

(1)Singleton 單一實(shí)例模式:?jiǎn)我粚?shí)例對(duì)象對(duì)每個(gè)對(duì)象和每個(gè)請(qǐng)求都是相同的,可以說(shuō)是不同客戶端不同請(qǐng)求都是相同的。

(2)Transient 暫時(shí)性模式:暫時(shí)性對(duì)象始終不同,無(wú)論是不是同一個(gè)請(qǐng)求(同一個(gè)請(qǐng)求里的不同服務(wù))同一個(gè)客戶端,每次都是創(chuàng)建新的實(shí)例。

(3)Scoped作用域模式:作用域?qū)ο笤谝粋€(gè)客戶端請(qǐng)求中是相同的,但在多個(gè)客戶端請(qǐng)求中是不同的。(這句是文檔的原話,我覺(jué)得描述的很清晰)

什么時(shí)候用哪種模式?這個(gè)不大好說(shuō)(希望這個(gè)可以成為討論點(diǎn))

比如一下吧:

1、日志記錄器可以實(shí)現(xiàn)為單例,因?yàn)樵谡麄€(gè)生命周期內(nèi)都可以只使用一個(gè)實(shí)例;

2、數(shù)據(jù)庫(kù)訪問(wèn)上下文(DbContext)選擇 Scoped 的應(yīng)該是最佳候選,因?yàn)?services.AddDbContext 默認(rèn)就是 Scoped(哈哈哈);

3、如果需要利用深度依賴(lài)關(guān)系圖(a deep dependency graph)創(chuàng)建惟一對(duì)象,則可以考慮將該對(duì)象注冊(cè)為 transient 。

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

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

還有一個(gè)stackoverflow 的

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

按別人的經(jīng)驗(yàn),可以作為參考參考:

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

怎么驗(yàn)證?請(qǐng)用 官方例子 運(yùn)行一下看結(jié)果:

瀏覽器第一個(gè)tab頁(yè)面(第一個(gè)請(qǐng)求,可以認(rèn)為是一個(gè)客戶端):

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

瀏覽器第二個(gè)tab頁(yè)面(第二個(gè)請(qǐng)求,可以認(rèn)為是另一個(gè)客戶端):

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

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI