C# DI依賴注入的實現(xiàn)示例
本文介紹了C# DI依賴注入的實現(xiàn)示例,具體如下:
using Microsoft.Extensions.DependencyInjection; using System; namespace ioc1 { class Program { static void Main(string[] args) { ServiceCollection services = new ServiceCollection(); //每次請求獲取都是新的對象實例 services.AddTransient<ITestService, TestServiceImpl>(); //每次在一個生命周期中請求獲取的都是同一個對象 services.AddSingleton<TestServiceImpl2>(); //同一個范圍內(nèi)獲取的是同一個對象范圍指“{}”再統(tǒng)一個大括號中的對象 services.AddScoped<TestServiceImpl3>(); using( ServiceProvider sp = services.BuildServiceProvider()) { //GetService如果找不到服務,就返回null //GetRequiredService:必須的,如果找不到就報異常 //GetServices找到服務的集合; 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相關對象,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)建了一個新的ServiceCollection
實例。這是.NET Core中用于管理服務(也就是依賴項)的容器。
2.services.AddTransient<TestServiceImpl>();
這行代碼向ServiceCollection
中添加了一個名為TestServiceImpl
的臨時服務。AddTransient
方法告訴.NET Core在每次請求該服務時創(chuàng)建一個新的實例。這意味著每次從服務提供者獲取該服務時,都會得到一個新的TestServiceImpl
實例。
3. using( ServiceProvider sp = services.BuildServiceProvider())
這行代碼創(chuàng)建了一個ServiceProvider
實例,該實例是.NET Core中實現(xiàn)依賴注入的實際對象。使用BuildServiceProvider
方法后,你可以使用這個ServiceProvider
實例來獲取之前添加的服務。
4. TestServiceImpl t = sp.GetService<TestServiceImpl>();
這行代碼使用創(chuàng)建的ServiceProvider
實例sp
來獲取一個類型為TestServiceImpl
的服務。由于之前使用的是AddTransient<TestServiceImpl>()
,所以這里會得到一個新的TestServiceImpl
實例。
5. t.Name = "白沙王";
這行代碼給獲取到的TestServiceImpl
實例的Name
屬性賦值,將其設置為"白沙王"。
6. t.SayHi();
這行代碼調(diào)用TestServiceImpl
實例的SayHi
方法。這個方法可能會輸出一些信息,但由于你沒有給出TestServiceImpl
類的定義,我無法確定其具體行為。
總的來說,這段代碼創(chuàng)建了一個服務,注冊到了依賴注入容器中,并從容器中獲取這個服務來使用。這是.NET Core應用中常見的依賴注入模式的一個例子。
services.AddSingleton<TestServiceImpl2>();
這行代碼向ServiceCollection
中添加了一個名為TestServiceImpl2
的單例服務。這意味著在整個應用程序的生命周期中,只有一個TestServiceImpl2
實例會被創(chuàng)建,并且每次請求該服務時都會返回同一個實例。
到此這篇關于C# DI依賴注入的實現(xiàn)示例的文章就介紹到這了,更多相關C# DI依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C# wpf使用ffmpeg命令行實現(xiàn)錄屏的示例代碼
本文主要介紹了C# wpf使用ffmpeg命令行實現(xiàn)錄屏的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08