內置IOC容器ServiceCollection

.NetCore內置IOC容器ServiceCollection

一、IOC介紹

IOC:全名(Inversion of Control)-控制反轉

IOC意味著我們將對象的創建控制權交給了外部容器,我們不管它是如何創建的,我們只需要知道,當我們想要某個實例時,我們可以直接從這個外部容器中去拿,而再也不需要我們去new了,充分體現了DIP(依賴倒置原則),也體現了我們經常掛在嘴邊的面向接口編程。

DI:全名(Dependency Injection)-依賴注入

DI意味著將類型之間的依賴關系注入到DI容器中

在之前的.Net Framework中并沒有集成IOC,雖然Microsoft自己有一套"Unity",想要使用IOC+DI時,還需要我們自己去安裝包,進行三部曲等等各種操作

比較流行的IOC容器技術:Autofac、Unity、NInject。。。

二、.NetCore內置IOC容器ServiceCollection

1、打開NuGet包管理器,安裝?Microsoft.Extensions.DependencyInjection?包

2、實現代碼如下:

public?interface?ISqlHelper
{void?GetAll();
}
public?class?SqlServerHelper?:?ISqlHelper
{public?void?GetAll(){Console.WriteLine("this?is?"+typeof(SqlServerHelper));}
}
static?void?Main(string[]?args)
{ServiceCollection?services?=?new?ServiceCollection();services.AddTransient<ISqlHelper,?SqlServerHelper>();var?provider=services.BuildServiceProvider();var?sqlHelper=provider.GetService<ISqlHelper>();sqlHelper.GetAll();Console.ReadKey();
}

運行結果輸出:this is SqlServerHelper

當我們在執行業務邏輯時想要寫入一些日志(Log),必然會當然依賴這個類,那么會形成了SqlHelper類與Log類之前的依賴關系,我們可以將之前的依賴關系轉移到DI容器中,也就是依賴注入(DI),然后在DI容器獲取服務(對象)

示例代碼如下:

public?interface?ISqlHelper?
{void?GetAll();
}
public?class?SqlServerHelper?:?ISqlHelper?
{private?readonly?ILog?_ilog;public?SqlServerHelper(ILog?ilog)?{_ilog?=?ilog;}public?void?GetAll()?{_ilog.LogInfo($"我在{typeof(SqlServerHelper).Name}中,我是ilog");Console.WriteLine("this?is?"?+?typeof(SqlServerHelper).Name);}
}
public?interface?ILog?
{void?LogInfo(string?msg);
}
public?class?Log?:?ILog?
{public?void?LogInfo(string?msg)?{Console.WriteLine(msg);}
}
private?static?void?Main(string[]?args)?
{services.AddTransient<ILog,?Log>();//瞬時注入services.AddTransient<ISqlHelper,?SqlServerHelper>();//瞬時,每次的實例都是一個新的對象var?provider?=?services.BuildServiceProvider();//構建服務提供商var?sqlHelper?=?provider.GetService<ISqlHelper>();//獲取我們需要的服務實例sqlHelper.GetAll();Console.ReadKey();
}

如果如下:

我在SqlServerHelper中,我是ilog
this?is?SqlServerHelper

三、組件的生命周期

1、Transient:瞬時,每次的實例都是一個新的對象

2、Singleton:單例,全局唯一實例

3、Scoped:作用域,在一個作用域中唯一實例,比如在Asp.Net Core應用程序中一次請求相當于一個Scoped

Transient:瞬時,每次的實例都是一個新的對象

ServiceCollection?services?=?new?ServiceCollection();
services.AddTransient<ILog,?Log>();
services.AddTransient<ISqlHelper,?SqlServerHelper>();
var?provider?=?services.BuildServiceProvider();
var?sqlHelper?=?provider.GetService<ISqlHelper>();//首次獲取要使用的服務
sqlHelper?=?provider.GetService<ISqlHelper>();//獲取新的服務
sqlHelper.GetAll();
a7a11cba3eeea6df02169b50d112397c.png
瞬時

結果如下:

1dc12d7d8a87248bf93ec3cbac87e05f.png
瞬時結果

Singleton:單例,全局唯一實例

ServiceCollection?services?=?new?ServiceCollection();
services.AddSingleton<ILog,?Log>();
services.AddSingleton<ISqlHelper,?SqlServerHelper>();
var?provider?=?services.BuildServiceProvider();
var?sqlHelper?=?provider.GetService<ISqlHelper>();
sqlHelper?=?provider.GetService<ISqlHelper>();
sqlHelper.GetAll();
Console.ReadKey();
ae0be01a4751c212cf80e7d13009e624.png
單例

Scoped:作用域,在一個作用域中唯一實例

一個作用域

ServiceCollection?services?=?new?ServiceCollection();
services.AddScoped<ILog,?Log>();
services.AddScoped<ISqlHelper,?SqlServerHelper>();
var?provider?=?services.BuildServiceProvider();
var?scope1?=?provider.CreateScope();//在一個作用域下創建第一個子作用域???????
var?sqlHelper?=?scope1.ServiceProvider.GetService<ISqlHelper>();
184d686f035adfc6b1278c3abf2d41f9.png

新的作用域

ServiceCollection?services?=?new?ServiceCollection();
services.AddScoped<ILog,?Log>();
services.AddScoped<ISqlHelper,?SqlServerHelper>();
var?provider?=?services.BuildServiceProvider();
var?scope1?=?provider.CreateScope();
//在一個作用域下創建第一個子作用域???????
var?sqlHelper?=?scope1.ServiceProvider.GetService<ISqlHelper>();
var?scope2?=?provider.CreateScope();
//在一個作用域下創建第二個子作用域
sqlHelper?=?scope2.ServiceProvider.GetService<ISqlHelper>();
2845d67ba96394f8c4c6bd8a2eaab4df.png

注意:由于是控制臺項目,只能用子作用域來體現作用域的特點,在web項目中,一次請求就相當于一個作用域

推薦閱讀

  • ??生成條形碼二維碼DataMatrix條碼.EAN碼.39碼.交叉25碼.UPC碼.128碼.93碼.ISBN碼.Codabar等

  • ??C#生成二維碼的兩種快捷方式

  • ??ShellProgressBar控制臺中漂亮的顯示進度條

  • ??C#10特性試用|全局和隱式usings

資料參考

  • ??ServiceCollection 類 (Microsoft.Extensions.DependencyInjection) | Microsoft Learn[1]

  • ??ASP.NET Core 中的 ServiceProvider - hippieZhou - 博客園[2]

歡迎關注我的公眾號“Net分享”,技術文章第一時間推送 , 分享一些你可能注意不到的細節。

f3a3951a42deb6c84ab209f1924d8b6b.jpeg?

引用鏈接

[1]?ServiceCollection 類 (Microsoft.Extensions.DependencyInjection) | Microsoft Learn:?https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.dependencyinjection.servicecollection?view=dotnet-plat-ext-6.0
[2]:?https://blog.csdn.net/m1m2m3mmm/article/details/123231352

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281787.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281787.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281787.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中 有沒有方法將瀏覽器標簽欄去掉_用JS去掉IE窗口的標題欄,工具欄,地址欄...

前言:經常上網的朋友可能會到過這樣一些網站&#xff0c;一進入首頁立刻會彈出一個窗口&#xff0c;或者按一個連接或按鈕彈出&#xff0c;通常在這個窗口里會顯示一些注意事項、版權信息 、警告、歡迎光顧之類的話或者作者想要特別提示的信息。其實制作這樣的頁面效果非常的容…

React+Redux仿Web追書神器

引言 由于 10 月份做的 React Native 項目沒有使用到 Redux 等庫&#xff0c;寫了一段時間想深入學習 React&#xff0c;有個想法想做個 demo 練手下&#xff0c;那時候其實還沒想好要做哪一個類型的&#xff0c;也看了些動漫的&#xff0c;小說閱讀&#xff0c;聚合資源的開源…

【算法】LeetCode算法題-Maximum Subarray

這是悅樂書的第154次更新&#xff0c;第156篇原創 01 看題和準備 今天介紹的是LeetCode算法題中Easy級別的第13題&#xff08;順位題號是53&#xff09;。給定一個整數數組nums&#xff0c;找出一個最大和&#xff0c;此和是由數組中索引連續的元素組成&#xff0c;至少包含一個…

windows配置solr5.5.2(不通過tomcat,使用內置jetty)

一、windows下配置solr5.5.2(不通過tomcat,使用內置jetty) 第一步&#xff1a;安裝Jdk1.7 Solr5.5好像只支持Jdk1.7及以上的版本&#xff0c;沒親測&#xff0c;solr6.0是只支持jdk1.8及以上的&#xff0c;下圖為啟動solr時的截圖&#xff1a; 如何在windows環境下配置jdk及驗證…

java起源英文_Abbreviation 英文詞組縮寫(來源:南陽理工大學ACM)java

As we know, we often use a short sequence of characters in place of some words with a very long name. For example, ACM is an abbreviation of “Association for Computing Machinery”. Now we are using an acronymic method to get the abbreviation. An acronym i…

【C# Personal Handbook】運行環境

一、CLR、CLI、CTS、CLS、BCL、FCL簡介CLI&#xff08;公共語言基礎&#xff09;CLI是微軟公司向ECMA提交的一份語言和數據格式規范&#xff0c;CLR是目前為止唯一一個公共語言基礎的實現版本。CLI包括了公共類型系統&#xff08;CTS&#xff09;、公共中間語言&#xff08;CIL…

如何完善自己的知識結構

★領域 &#xff08;本來想用“學科”這個詞&#xff0c;后來覺得“學科”的范疇還是偏小&#xff0c;就改用“領域”&#xff09;  按照傳統的習慣&#xff0c;通常會把知識歸類到不同的領域&#xff08;比如&#xff1a;文學、數學、計算機、烹調、等等&#xff09;。 ◇領…

MATLAB編程與應用系列-關于MATLAB編程入門教程的總體編寫安排

本系列教程來源于出版設計《基于MATLAB編程基礎與典型應用書籍》&#xff0c;如涉及版權問題&#xff0c;請聯系&#xff1a;156204968qq.com。 出版社&#xff1a;人民郵電出版社&#xff0c; 頁數&#xff1a;525。 本系列教程目前基于MATLABR2006a&#xff0c;可能對于更高級…

python語言特性-------python2.7教程學習【廖雪峰版】(一)

開始學習廖雪峰的py2.7教程&#xff1a; 2017年6月5日12:54:28 筆記&#xff1a; 廖雪峰python2.7教程1.用任何編程語言來開發程序&#xff0c;都是為了讓計算機干活。 2.Python是一種相當高級的語言。代碼少還不好&#xff1f;代碼少的代價是運行速度慢。3.用Python可以做什么…

java調c++代碼_Java中調用C++代碼的實現 | 學步園

JNI為 Java Native Interface 即Java本地接口&#xff0c;使用此種方式可以對C/C代碼進行調用&#xff0c;其在本質上是對C/C生成的動態庫進行調用而不是直接對C/C代碼進行調用Java代碼如下&#xff1a;public class TestJNI{//JNI在本質上是調用C/C的動態庫來實現的&#xff…

jeesite1.X 集成多數據源

2019獨角獸企業重金招聘Python工程師標準>>> 網上看了幾個例子&#xff0c;都是相同數據源的動態切換&#xff0c;如果不是同一種數據庫類型&#xff0c;分頁查詢就出問題。經過研究解決問題。 jeesite.properties配置多數數據源地址,這里以mysql5.7和sqlserver2008…

k8s HPA(HorizontalPodAutoscaler)-自動水平伸縮

Horizontal Pod Autoscaling in Kubernetes寫在前面我們平時部署web服務&#xff0c;當服務壓力大撐不住的時候&#xff0c;我們會加機器(加錢)&#xff1b;一般沒有上容器編排是手動加的&#xff0c;臨時加的機器&#xff0c;臨時部署的服務還要改Nginx的配置&#xff0c;最后…

jQuery 基金會和 Dojo 基金會合并:Open Web

統一基金會&#xff0c;服務開發人員&#xff0c;推動開放 Web 技術發展jQuery 基金會和 Dojo 基金會今天宣布計劃聯合&#xff0c;旨在建立最大&#xff0c;最多樣化和最全面的基金會&#xff0c;通過服務開發者&#xff0c;他們的項目&#xff0c;他們的社區來構建開放的 Web…

spark java 邏輯回歸_邏輯回歸分類技術分享,使用Java和Spark區分垃圾郵件

原標題&#xff1a;邏輯回歸分類技術分享&#xff0c;使用Java和Spark區分垃圾郵件由于最近的工作原因&#xff0c;小鳥很久沒給大家分享技術了。今天小鳥就給大家介紹一種比較火的機器學習算法&#xff0c;邏輯回歸分類算法。回歸是一種監督式學習的方式&#xff0c;與分類類似…

jQuery.extend()方法

定義和用法jQuery.extend()函數用于將一個或多個對象的內容合并到目標對象。 注意&#xff1a; 1. 如果只為$.extend()指定了一個參數&#xff0c;則意味著參數target被省略。此時&#xff0c;target就是jQuery對象本身。通過這種方式&#xff0c;我們可以為全局對象jQuery添加…

1066. 圖像過濾(15)

原題: https://www.patest.cn/contests/pat-b-practise/1066 思路: 開胃小菜 實現: #include <stdio.h>int main (void) {int m;int n;int a;int b;int c;char ch;int tmp;int i;int j;scanf("%d %d %d %d %d", &m, &n, &a, &b, &c);// 題…

Wget用法、參數解釋的比較好的一個文章

一個語句就可以下載cvpr2016的全部論文&#xff1a; wget -c -N --no-clobber --convert-links --random-wait -r -p -E -e robotsoff -U mozilla http://www.cv-foundation.org/openaccess/CVPR2016.py 其中&#xff0c;-c表示斷點續傳&#xff1b;-N表示已經下載的內容不再重…

.NET VS智能提示漢化 (.Net6)

先上現成的.net6漢化文件&#xff0c;可以手動下載后參照 [如何為 .NET 安裝本地化的 IntelliSense 文件 ](https://learn.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense)進行安裝。或者使用后文的工具進行自動安裝。無對照英文在前中文在前漢化內容來自 官…

go 返回mysql數組_Go基礎之--操作Mysql(一)

關于標準庫database/sqldatabase/sql是golang的標準庫之一&#xff0c;它提供了一系列接口方法&#xff0c;用于訪問關系數據庫。它并不會提供數據庫特有的方法&#xff0c;那些特有的方法交給數據庫驅動去實現。database/sql庫提供了一些type。這些類型對掌握它的用法非常重要…

Vue CLI 3開發中屏蔽煩人的EsLint錯誤

問題 Vue開發中&#xff0c;特別是當你閱讀分析別人的其中早期版本的Vue代碼時往往會遭遇到滿屏幕的煩人的EsLint錯誤。有關EsLint這個工具的作用不再贅述。查閱網上參考文檔&#xff0c;大多是針對早起版本Vue CLI工具項目的&#xff0c;在我最新使用的Vue CLI 3生成的工程中根…