• Core的学习三:容器的使用实例


    我们在Startup类里面可以看到那么一句话:

            // This method gets called by the runtime. Use this method to add services to the container.
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllersWithViews();
                services.AddSession();
            }

    意思就是:要把服务注入容器里面去【core内置IOC】:当前方法被运行时环境调入,把服务添加到container容器里面去,IServiceCollection其实就是个一个容器,那我们是怎么使用,怎么解析呢???

    要使用它就必须要有个接口,以及接口的实例,那我们就来写个接口实例:

        /// 容器的使用:
        /// 1.创建一个容器的实例;
        /// 2.注册
        /// 3.获取服务
            /// <summary>
            /// 容器的使用实例
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                {
                    Console.WriteLine("容器的使用实例");
                    //1.创建一个容器的实例,需要添加NuGet【Microsoft.Extensions.DependencyInjection】,同时引用命名空间
                    IServiceCollection container = new ServiceCollection();
    
                    //2.注册【注册有4种方式,用Add添加的方式】
                    //第一种瞬时生命周期,每次获取的对象都是一个新的对象
                    container.AddTransient<IServiceA, ServiceA>();
                    //第二种单例注册,单例生命周期:在容器中永远只有当前这一个
                    container.AddSingleton<IServiceB, ServiceB>();
                    //第三种作用域注册,生命周期:当前请求作用域,只有当前这个实例,除非二次请求,或者作用域不一样
                    container.AddScoped<IServiceC, ServiceC>();
                    //第四种:跟单例的生命周期一样
                    container.AddSingleton<IServiceD>(new ServiceD());
    
                    //3.获取服务【Alt+Shift 竖列选择】【ctrl+K+D:自动格式化】
                    ServiceProvider provider = container.BuildServiceProvider();
                    IServiceA TestA = provider.GetService<IServiceA>();
                    IServiceB TestB = provider.GetService<IServiceB>();
                    IServiceC TestC = provider.GetService<IServiceC>();
                    IServiceD TestD = provider.GetService<IServiceD>();
    
                    //做比较
                    IServiceA TestA1 = provider.GetService<IServiceA>();
                    IServiceB TestB1 = provider.GetService<IServiceB>();
                    IServiceC TestC1 = provider.GetService<IServiceC>();
                    IServiceD TestD1 = provider.GetService<IServiceD>();
    
                    Console.WriteLine($"瞬时生命周期比较,结果:{Object.ReferenceEquals(TestA, TestA1)}");
                    Console.WriteLine($"单例1的生命周期比较,结果:{ReferenceEquals(TestB, TestB1)}");
                    Console.WriteLine($"单例2的生命周期比较,结果:{Object.ReferenceEquals(TestD, TestD1)}");
    
                    //同一个作用域比较
                    Console.WriteLine($"同作用域生命周期比较,结果:{Object.ReferenceEquals(TestC, TestC1)}");
    
                    //新建一个作用域
                    IServiceScope scope = provider.CreateScope();
                    IServiceC TestC2 = scope.ServiceProvider.GetService<IServiceC>();
                    //不同作用域比较
                    Console.WriteLine($"不同作用域生命周期比较,结果:{Object.ReferenceEquals(TestC,TestC2)}");
    
                }
                Console.ReadLine();
            }

    结果: 

           

    这边单独写了两个接口类库:Core.Interface,Core.Service

    Core.Interface 

        public interface IServiceA
        {
            void Show();
        }
        public interface IServiceB
        {
            void Show();
        }
        public interface IServiceC
        {
            void Show();
        }
        public interface IServiceD
        {
            void Show();
        }

    Core.Service:

        public class ServiceA : IServiceA
        {
            public void Show()
            {
                Console.WriteLine("ServiceA");
            }
        }
        public class ServiceB : IServiceB
        {
            public  ServiceB(IServiceA iservice)
            { 
            }
            public void Show()
            {
                Console.WriteLine("This's ServiceB");
            }
        }
        public class ServiceC : IServiceC
        {
            public ServiceC(IServiceB iservice)
            { 
            }
            public void Show()
            {
                Console.WriteLine("This's ServiceC");
            }
        }
        public class ServiceD : IServiceD
        {
            public void Show()
            {
                Console.WriteLine("ServiceD");
            }
        }
  • 相关阅读:
    go 错误处理策略
    git merge
    oracle
    使用PHPExcel导入数据库,date数据的问题
    PhpWord使用
    ThinkPHP
    Memcache
    没用过docker就out了
    TCP三次挥手四次协议
    数据分析
  • 原文地址:https://www.cnblogs.com/wangwangwangMax/p/14080843.html
Copyright © 2020-2023  润新知