Asp.NetCore3.1 Autofac生命周期

autofac生命周期,一共有六种生命周期。通过下面示例展示每种声明周期的作用范围:

        public void ConfigureContainer(ContainerBuilder containerBuilder)
        {
            #region autofac生命周期
            //autofac生命周期 六种生命周期
            //1.瞬时生命周期:注册之后,每次获取的服务实例都不一样
            containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>().InstancePerDependency();

            //2.单例:如果使用单例生命周期注册,那么在整个容器中获取的服务实例都是同一个
            containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>().SingleInstance();

            //3.作用域生命周期:只有在相同作用域下获取到的服务实例才是相同的
            containerBuilder.RegisterType<TestServiceC>().As<ITestServiceC>().InstancePerLifetimeScope();

            //4.作用域生命周期:相比上一种,可以更加精确到指定某一个作用域
            containerBuilder.RegisterType<TestServiceD>().As<ITestServiceD>().InstancePerMatchingLifetimeScope("MyRequest");

            //5.某个请求的声明周期:不同的请求获取到的服务实例不一样
            //containerBuilder.RegisterType<TestServiceE>().As<ITestServiceE>().InstancePerRequest();

            //6.拥有隐式关系:类型的创建新的嵌套声明周期作用域,可以使用每一个拥有实例的注册来依赖关系限定到拥有的实例
            //containerBuilder.RegisterType<TestServiceB>().InstancePerOwned<ITestServiceF>();

            IContainer container = containerBuilder.Build();
            ITestServiceA testServiceA1 = container.Resolve<ITestServiceA>();
            ITestServiceA testServiceA2 = container.Resolve<ITestServiceA>();
            Console.WriteLine($"testServiceA1和testServiceA2 是否相同 {object.ReferenceEquals(testServiceA1, testServiceA2)}");//false


            ITestServiceB testServiceB1 = container.Resolve<ITestServiceB>();
            ITestServiceB testServiceB2 = container.Resolve<ITestServiceB>();
            Console.WriteLine($"testServiceB1和testServiceB2 是否相同 {object.ReferenceEquals(testServiceB1, testServiceB2)}");//true

            ITestServiceC testServiceC1 = container.Resolve<ITestServiceC>();
            ITestServiceC testServiceC2 = container.Resolve<ITestServiceC>();
            Console.WriteLine($"testServiceC1和testServiceC2 是否相同 {object.ReferenceEquals(testServiceC1, testServiceC2)}");//true

            using (var inner = container.BeginLifetimeScope("MyRequest"))
            {
                ITestServiceD testServiceD1 = inner.Resolve<ITestServiceD>();
                ITestServiceD testServiceD2 = inner.Resolve<ITestServiceD>();
                Console.WriteLine($"testServiceD1和testServiceD2 是否相同 {object.ReferenceEquals(testServiceD1, testServiceD2)}");//true

                using (var inner1 = container.BeginLifetimeScope("MyRequest"))
                {
                    ITestServiceD testServiceD3 = inner1.Resolve<ITestServiceD>();
                    ITestServiceD testServiceD4 = inner1.Resolve<ITestServiceD>();
                    Console.WriteLine($"testServiceD3和testServiceD4 是否相同 {object.ReferenceEquals(testServiceD3, testServiceD4)}");//true
                    Console.WriteLine($"testServiceD1和testServiceD3 是否相同 {object.ReferenceEquals(testServiceD1, testServiceD3)}");//false
                }
            }

            #endregion
        }

六种生命周期分别为:

1.瞬时生命周期:注册之后,每次获取的服务实例都不一样

2.单例:如果使用单例生命周期注册,那么在整个容器中获取的服务实例都是同一个

3.作用域生命周期:只有在相同作用域下获取到的服务实例才是相同的

4.作用域生命周期:相比上一种,可以更加精确到指定某一个作用域

5.某个请求的声明周期:不同的请求获取到的服务实例不一样(使用较少)

6.拥有隐式关系:类型的创建新的嵌套声明周期作用域,可以使用每一个拥有实例的注册来依赖关系限定到拥有的实例(使用较少)

猜你喜欢

转载自blog.csdn.net/liangmengbk/article/details/121501035