C# DI依赖注入的实现示例
作者:白沙王
本文介绍了C# DI依赖注入的实现示例,具体如下:
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>(); //同一个范围内获取的是同一个对象范围指“{}”再统一个大括号中的对象 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();
这行代码创建了一个新的ServiceCollection
实例。这是.NET Core中用于管理服务(也就是依赖项)的容器。
2.services.AddTransient<TestServiceImpl>();
这行代码向ServiceCollection
中添加了一个名为TestServiceImpl
的临时服务。AddTransient
方法告诉.NET Core在每次请求该服务时创建一个新的实例。这意味着每次从服务提供者获取该服务时,都会得到一个新的TestServiceImpl
实例。
3. using( ServiceProvider sp = services.BuildServiceProvider())
这行代码创建了一个ServiceProvider
实例,该实例是.NET Core中实现依赖注入的实际对象。使用BuildServiceProvider
方法后,你可以使用这个ServiceProvider
实例来获取之前添加的服务。
4. TestServiceImpl t = sp.GetService<TestServiceImpl>();
这行代码使用创建的ServiceProvider
实例sp
来获取一个类型为TestServiceImpl
的服务。由于之前使用的是AddTransient<TestServiceImpl>()
,所以这里会得到一个新的TestServiceImpl
实例。
5. t.Name = "白沙王";
这行代码给获取到的TestServiceImpl
实例的Name
属性赋值,将其设置为"白沙王"。
6. t.SayHi();
这行代码调用TestServiceImpl
实例的SayHi
方法。这个方法可能会输出一些信息,但由于你没有给出TestServiceImpl
类的定义,我无法确定其具体行为。
总的来说,这段代码创建了一个服务,注册到了依赖注入容器中,并从容器中获取这个服务来使用。这是.NET Core应用中常见的依赖注入模式的一个例子。
services.AddSingleton<TestServiceImpl2>();
这行代码向ServiceCollection
中添加了一个名为TestServiceImpl2
的单例服务。这意味着在整个应用程序的生命周期中,只有一个TestServiceImpl2
实例会被创建,并且每次请求该服务时都会返回同一个实例。
到此这篇关于C# DI依赖注入的实现示例的文章就介绍到这了,更多相关C# DI依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!