资料: https://www.bilibili.com/video/BV1pK41137He?p=37&vd_source=3a84a44121e9b8985ecd1584a76772ad
DI(依赖注入)
// https://blog.csdn.net/weixin_50784508/article/details/134937376
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();
// test1:
Console.WriteLine("---基本的DI, 证明不是一个实例-------------------");
ITestService t1 = sp.GetService<ITestService>();
Console.WriteLine(t.GetType());
Console.WriteLine(object.ReferenceEquals(t, t1));
t1.Name = "喜马拉雅";
t1.SayHi();
Console.WriteLine("----------------------");
// test2:
Console.WriteLine("---两次DI, 证明注入的配置是在一个实例-------------------");
// 恢复默认值
TestServiceImpl2 t2 = sp.GetService<TestServiceImpl2>();
t2.Name = "白沙王";
t2.SayHi();
// 查看两次DI 注入的配置是否能共存
TestServiceImpl2 t21 = sp.GetService<TestServiceImpl2>();
Console.WriteLine(object.ReferenceEquals(t2, t21)); // True 说明 整个生命周期只创建了 TestServiceImpl2,后面Name被设置为的两个值,会覆盖
t21.Name = "喜马拉雅";
t21.SayHi();
t2.SayHi();
Console.WriteLine("----------------------");
// test3:
Console.WriteLine("---两次DI,另一种实现方式 -------------------");
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();
t3.SayHi();
Console.WriteLine(object.ReferenceEquals(t3, t33));
Console.WriteLine("----------------------");
}
}
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}");
}
}
}