一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 淺談.net core 注入中的三種模式:Singleton、Scoped 和 Transient

淺談.net core 注入中的三種模式:Singleton、Scoped 和 Transient

2020-06-12 17:00Vam8023 ASP.NET教程

這篇文章主要介紹了淺談.net core 注入中的三種模式:Singleton、Scoped 和 Transient,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

從上篇內容不如題的文章《.net core 并發下的線程安全問題》擴展認識.net core注入中的三種模式:Singleton、Scoped 和 Transient

我們都知道在 Startup 的ConfigureServices 可以注入我們想要的服務,那么在注入的時候有三種模式可以選擇,那么我們在什么時候選擇什么樣的模式呢?

在講注入模式之前,我覺得很有必要了解服務生存期的概念!

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

IServiceProvider 怎么負責的呢?

?
1
2
3
4
5
6
7
// System.IServiceProvider
using System;
 
public interface IServiceProvider
{
 object GetService(Type serviceType);
}

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

?
1
2
3
4
5
6
7
8
9
10
//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(服務集合),那服務怎么加進入(實現)的呢

?
1
2
3
4
5
6
7
8
9
//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;
}

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

?
1
2
3
4
5
6
7
// Microsoft.Extensions.DependencyInjection.ServiceLifetime
public enum ServiceLifetime
{
 Singleton,
 Scoped,
 Transient
}

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

淺談.net core 注入中的三種模式:Singleton、Scoped 和 Transient

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

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

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

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

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

比如一下吧:

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

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

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

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

淺談.net core 注入中的三種模式:Singleton、Scoped 和 Transient

還有一個stackoverflow 的

淺談.net core 注入中的三種模式:Singleton、Scoped 和 Transient

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

淺談.net core 注入中的三種模式:Singleton、Scoped 和 Transient

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

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

淺談.net core 注入中的三種模式:Singleton、Scoped 和 Transient

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

淺談.net core 注入中的三種模式:Singleton、Scoped 和 Transient

看上面的結果就不多說了。

這篇擴展認識寫得還蠻有意思的,尤其是在找這三種模式的使用場景,雖然自己有點見解,但絕對不完整。如更好的見解,很希望能一起分享一下。

下一篇的擴展好像要回到源頭,擼擼 .net core 的注入了,哈哈哈……

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/Vam8023/p/10684651.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 兽操人| 大学生特黄特色大片免费播放 | 久久学生精品国产自在拍 | avtt在线| 国产99精品视频 | 亚洲国产欧美在线人网站 | 免费观看欧美性一级 | 免费国产一级 | 2020韩国三级理论在线观看 | 久见久热 这里只有精品 | 亚洲国产精品无码中文字满 | 波多野结衣xxxx性精品 | 国产精品午夜久久 | yy6080久久国产伦理 | 日本无遮挡亲吻膜下面免费 | 免费网址视频在线看 | 调教老师肉色丝袜的故事 | 亚洲精品一区二区三区中文字幕 | 九草视频在线 | 大香焦在线观看 | 交换性关系中文字幕6 | 国产精品香蕉夜间视频免费播放 | 亚洲国产成人久久77 | 亚洲狠狠网站色噜噜 | 毛片免费视频观看 | 修修视频在线观看 | 亚洲乱码一二三四五六区 | 色先锋 影音先锋a 资源站 | 欧美在线观看一区二区三 | 久久亚洲精品专区蓝色区 | 国内精品91东航翘臀女神在线 | 国产成人精品免费视频大全五级 | 希岛爱理作品在线观看 | 国产靠逼视频 | 天天操夜夜操狠狠操 | 国产精品二区高清在线 | 日本春菜花在线中文字幕 | 色综合久久夜色精品国产 | 精品高潮呻吟99AV无码 | 成人网18免费网 | 国产第一综合另类色区奇米 |