using System;
using Microsoft.Extensions.DependencyInjection;//导入控制反转中间件
namespace IOC
{
class Program
{
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();//服务集合
//添加服务 *************************
/// services.AddTransient<TestService1>(); //1.瞬态 拿到2个对象
///services.AddSingleton<TestService1>();//2.单例 同一个对象
services.AddScoped<TestService1>(); //3.范围
//实现IDisposable接口 using 防止资源泄露
//ServiceProvider==服务定位器 ****************************************
using ( ServiceProvider provider = services.BuildServiceProvider())
{
/* TestService1 t1= provider.GetService<TestService1>();//向 服务定位器要服务
t1.Name = "sasa";
t1.SayHi();
TestService1 t2 = provider.GetService<TestService1>();//向 服务定位器要服务
Console.WriteLine(object.ReferenceEquals(t1,t2));
t2.Name = "okok";
t2.SayHi();
t1.SayHi();*/
TestService1 f1;
using (IServiceScope scope = provider.CreateScope()) //3.范围
{
//在scope中获取Scope相关的对象, scope.ServiceProvider 而不是provider
// scope.ServiceProvider.GetRequiredService
TestService1 t1= scope.ServiceProvider.GetService<TestService1>();//向 服务定位器要服务
t1.Name = "sasa";
t1.SayHi();
TestService1 t2 = scope.ServiceProvider.GetService<TestService1>();//向 服务定位器要服务
Console.WriteLine(object.ReferenceEquals(t1, t2));
f1 = t1;
}
using (IServiceScope scope2 = provider.CreateScope()) //3.范围 范围内是同对象 出就不是一个对象
{
//在scope中获取Scope相关的对象, scope2.ServiceProvider 而不是provider
// scope.ServiceProvider.GetRequiredService
TestService1 t1 = scope2.ServiceProvider.GetService<TestService1>();//向 服务定位器要服务
t1.Name = "sasa";
t1.SayHi();
TestService1 t2 = scope2.ServiceProvider.GetService<TestService1>();//向 服务定位器要服务
Console.WriteLine(object.ReferenceEquals(t1, t2));
Console.WriteLine(object.ReferenceEquals(f1, t2));
}
Console.Read();
}
}
public interface ITestService
{
public string Name { get; set; }
public void SayHi();
}
//如果类实现IDisposable接口离开作用域会自动调用
public class TestService1 : ITestService,IDisposable
{
public string Name { get; set; }
public void Dispose()
{
Console.WriteLine("*********");
}
public void SayHi()
{
Console.WriteLine($"Hello {Name}");
}
}
public class TestService2 : ITestService
{
public string Name { get; set; }
public void SayHi()
{
Console.WriteLine($"Hello World!{Name}");
}
}
}
}