.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); }