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

 

posted @ 2021-10-24 09:33  不骄不傲  阅读(2804)  评论(0编辑  收藏  举报