C# DI依賴注入的實(shí)現(xiàn)示例
本文介紹了C# DI依賴注入的實(shí)現(xiàn)示例,具體如下:
using Microsoft.Extensions.DependencyInjection; using System; namespace ioc1 { class Program { static void Main(string[] args) { ServiceCollection services = new ServiceCollection(); //每次請(qǐng)求獲取都是新的對(duì)象實(shí)例 services.AddTransient<ITestService, TestServiceImpl>(); //每次在一個(gè)生命周期中請(qǐng)求獲取的都是同一個(gè)對(duì)象 services.AddSingleton<TestServiceImpl2>(); //同一個(gè)范圍內(nèi)獲取的是同一個(gè)對(duì)象范圍指“{}”再統(tǒng)一個(gè)大括號(hào)中的對(duì)象 services.AddScoped<TestServiceImpl3>(); using( ServiceProvider sp = services.BuildServiceProvider()) { //GetService如果找不到服務(wù),就返回null //GetRequiredService:必須的,如果找不到就報(bào)異常 //GetServices找到服務(wù)的集合; ITestService t = sp.GetService<ITestService>(); t.Name = "白沙王"; t.SayHi(); ITestService t1 = sp.GetService<ITestService>(); Console.WriteLine(t.GetType()); Console.WriteLine(object.ReferenceEquals(t,t1)); t1.Name = "喜馬拉雅"; t1.SayHi(); Console.WriteLine("----------------------"); TestServiceImpl2 t2 = sp.GetService<TestServiceImpl2>(); t2.Name = "白沙王"; t2.SayHi(); TestServiceImpl2 t21 = sp.GetService<TestServiceImpl2>(); Console.WriteLine(object.ReferenceEquals(t2, t21)); t21.Name = "喜馬拉雅"; t21.SayHi(); t2.SayHi(); Console.WriteLine("----------------------"); using (IServiceScope scope1 = sp.CreateScope()) { //再scope中獲取scope相關(guān)對(duì)象,scope.ServiceProvider而不是sp TestServiceImpl3 t3 = scope1.ServiceProvider.GetService<TestServiceImpl3>(); t3.Name = "白沙王"; t3.SayHi(); TestServiceImpl3 t33 = scope1.ServiceProvider.GetService<TestServiceImpl3>(); t33.Name = "喜馬拉雅"; t33.SayHi(); Console.WriteLine(object.ReferenceEquals(t3, t33)); } } Console.ReadKey(); } } interface ITestService { string Name { get; set; } void SayHi(); } public class TestServiceImpl : ITestService { public string Name { get; set; } public void SayHi() { Console.WriteLine($"Hi,i'm{Name}"); } } public class TestServiceImpl2 : ITestService { public string Name { get; set ; } public void SayHi() { Console.WriteLine($"你好,我是{Name}"); } } public class TestServiceImpl3 : ITestService { public string Name { get; set; } public void SayHi() { Console.WriteLine($"you good,我是{Name}"); } } }
Nuget添加Microsoft.Extensions.DependencyInjection;引用
1.ServiceCollection services = new ServiceCollection();
這行代碼創(chuàng)建了一個(gè)新的ServiceCollection
實(shí)例。這是.NET Core中用于管理服務(wù)(也就是依賴項(xiàng))的容器。
2.services.AddTransient<TestServiceImpl>();
這行代碼向ServiceCollection
中添加了一個(gè)名為TestServiceImpl
的臨時(shí)服務(wù)。AddTransient
方法告訴.NET Core在每次請(qǐng)求該服務(wù)時(shí)創(chuàng)建一個(gè)新的實(shí)例。這意味著每次從服務(wù)提供者獲取該服務(wù)時(shí),都會(huì)得到一個(gè)新的TestServiceImpl
實(shí)例。
3. using( ServiceProvider sp = services.BuildServiceProvider())
這行代碼創(chuàng)建了一個(gè)ServiceProvider
實(shí)例,該實(shí)例是.NET Core中實(shí)現(xiàn)依賴注入的實(shí)際對(duì)象。使用BuildServiceProvider
方法后,你可以使用這個(gè)ServiceProvider
實(shí)例來獲取之前添加的服務(wù)。
4. TestServiceImpl t = sp.GetService<TestServiceImpl>();
這行代碼使用創(chuàng)建的ServiceProvider
實(shí)例sp
來獲取一個(gè)類型為TestServiceImpl
的服務(wù)。由于之前使用的是AddTransient<TestServiceImpl>()
,所以這里會(huì)得到一個(gè)新的TestServiceImpl
實(shí)例。
5. t.Name = "白沙王";
這行代碼給獲取到的TestServiceImpl
實(shí)例的Name
屬性賦值,將其設(shè)置為"白沙王"。
6. t.SayHi();
這行代碼調(diào)用TestServiceImpl
實(shí)例的SayHi
方法。這個(gè)方法可能會(huì)輸出一些信息,但由于你沒有給出TestServiceImpl
類的定義,我無法確定其具體行為。
總的來說,這段代碼創(chuàng)建了一個(gè)服務(wù),注冊(cè)到了依賴注入容器中,并從容器中獲取這個(gè)服務(wù)來使用。這是.NET Core應(yīng)用中常見的依賴注入模式的一個(gè)例子。
services.AddSingleton<TestServiceImpl2>();
這行代碼向ServiceCollection
中添加了一個(gè)名為TestServiceImpl2
的單例服務(wù)。這意味著在整個(gè)應(yīng)用程序的生命周期中,只有一個(gè)TestServiceImpl2
實(shí)例會(huì)被創(chuàng)建,并且每次請(qǐng)求該服務(wù)時(shí)都會(huì)返回同一個(gè)實(shí)例。
到此這篇關(guān)于C# DI依賴注入的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# DI依賴注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#調(diào)用C++ DLL bool返回值始終為true的問題
這篇文章主要介紹了C#調(diào)用C++ DLL bool返回值始終為true的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11C#實(shí)現(xiàn)在控制臺(tái)輸入密碼顯示星號(hào)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在控制臺(tái)輸入密碼顯示星號(hào)的方法,感興趣的小伙伴們可以參考一下2016-04-04C#實(shí)現(xiàn)的中國移動(dòng)官網(wǎng)手機(jī)號(hào)碼采集器
這篇文章主要介紹了C#實(shí)現(xiàn)的中國移動(dòng)官網(wǎng)手機(jī)號(hào)碼采集器,本文先是采集號(hào)碼入庫,同時(shí)給出了篩選各類靚號(hào)的SQL語句,需要的朋友可以參考下2014-10-10使用Http Head方法獲取文件長度的實(shí)現(xiàn)方法詳解
本篇文章是對(duì)使用Http Head方法獲取文件長度的實(shí)現(xiàn)方法進(jìn)行詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C# Distinct和重寫IEqualityComparer時(shí)要知道的二三事
這篇文章主要給大家介紹了關(guān)于C# Distinct和重寫IEqualityComparer時(shí)要知道的二三事,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06C#實(shí)現(xiàn)一個(gè)相當(dāng)全面的數(shù)據(jù)轉(zhuǎn)換工具類
這篇文章主要為大家介紹了如何使用C#編寫一個(gè)通用工具類DataConvert來進(jìn)行數(shù)據(jù)轉(zhuǎn)換,包括30+個(gè)數(shù)據(jù)類型轉(zhuǎn)換,需要的可以了解一下2025-03-03