.NET5 IOC容器IServiceCollection 基本操作


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM