.net5内置ioc容器
什么是ioc容器?
把对象创建统一交给第三方容器来创建;
如何使用ioc?
方法一:
1.在Startup.cs中ConfigureServices函数来注册服务。
services.AddTransient<ITestServiceA, TestServiceA>();
#region IOC注册依赖关系 services.AddTransient<ITestServiceA, TestServiceA>(); #endregion
2.在需要使用的控制器中通过构造函数定义抽象类型作为参数
3.调用内部函数
第二种:
1.在Startup.cs中ConfigureServices函数来注册服务。
services.AddTransient<ITestServiceA, TestServiceA>();
2.在控制器构造函数中注入IServiceProvider
private readonly IServiceProvider _serviceProvider = null; public FirstController(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; }
3.通过serviceProvider服务调用内部函数
ITestServiceA testService = (ITestServiceA)_serviceProvider.GetService(typeof(ITestServiceA)); testService.Show();
IServiceCollection生命周期
//瞬时生命周期 { IServiceCollection serviceDescriptors = new ServiceCollection(); serviceDescriptors.AddTransient<ITestServiceA, TestServiceA>(); //瞬时生命周期,每次获取都是新的实例 ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); ITestServiceA testServiceA = serviceProvider.GetService<ITestServiceA>(); ITestServiceA testServiceA1 = serviceProvider.GetService<ITestServiceA>(); //两个对象地址不相同 var isOk = object.ReferenceEquals(testServiceA, testServiceA1); } //单例生命周期 { IServiceCollection serviceDescriptors = new ServiceCollection(); serviceDescriptors.AddSingleton<ITestServiceA, TestServiceA>(); //单例生命周期,在整个进程中获取的是相同实例 ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); ITestServiceA testServiceA = serviceProvider.GetService<ITestServiceA>(); ITestServiceA testServiceA1 = serviceProvider.GetService<ITestServiceA>(); //两个对象地址相同 var isOk = object.ReferenceEquals(testServiceA, testServiceA1); } //作用域生命周期 { IServiceCollection serviceDescriptors = new ServiceCollection(); serviceDescriptors.AddScoped<ITestServiceA, TestServiceA>(); //作用域生命周期,同一个作用获取的是相同对象实例 ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); ITestServiceA testServiceA = serviceProvider.GetService<ITestServiceA>(); ITestServiceA testServiceA1 = serviceProvider.GetService<ITestServiceA>(); //两个对象地址相同 var isOk = object.ReferenceEquals(testServiceA, testServiceA1); ServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider(); ITestServiceA testServiceA2 = serviceProvider1.GetService<ITestServiceA>(); var isOk1 = object.ReferenceEquals(testServiceA1, testServiceA2); }