ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Autofac生命周期

2022-05-15 15:34:01  阅读:189  来源: 互联网

标签:Autofac 生命周期 container 实例 builder Resolve scope1 var


Autofac注入方式

前面一节介绍了Autofac注入方式,这节介绍Autofac的生命周期,实例生命周期决定在同一个服务的每个请求的实例是如何共享的。

 

环境

Win10+VS2020+.NET 5.0 +Autofac 6.3.0

 

Autofac几种生命周期

l InstancePerDependency

l SingleInstance

l InstancePerLifetimeScope

l InstancePerMatchingLifetimeScope

l InstancePerOwned

l InstancePerHttpRequest

实践

项目结构

在上节Autofac的快速入门的项目上改造。

 

 

 

InstancePerDependency

默认模式,瞬时生命周期,每次调用,都会重新实例化对象;每次请求都创建一个新的对象;

var builder = new ContainerBuilder();

builder.RegisterType<TestServiceA>().As<ITestServiceA>().InstancePerDependency();

var container = builder.Build();

var testServiceA = container.Resolve<ITestServiceA>();

var testServiceA1 = container.Resolve<ITestServiceA>();

Console.WriteLine(object.ReferenceEquals(testServiceA,testServiceA1));

 

 

运行结果:

 

 

 

 

SingleInstance

单例模式,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;

var builder = new ContainerBuilder();

builder.RegisterType<TestServiceA>().As<ITestServiceA>().SingleInstance();

var container = builder.Build();

var testServiceA = container.Resolve<ITestServiceA>();

var testServiceA1 = container.Resolve<ITestServiceA>();

Console.WriteLine(object.ReferenceEquals(testServiceA,testServiceA1));

 

 

 

 

InstancePerLifetimeScope

同一个生命周期域中,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;且每个不同的生命周期域中的实例是唯一的,不共享的。

var builder = new ContainerBuilder();

builder.RegisterType<TestServiceA>().As<ITestServiceA>().InstancePerLifetimeScope();

var container = builder.Build();

ITestServiceA testServiceA15;

ITestServiceA testServiceA16;

using (var scope1 = container.BeginLifetimeScope())

{

    var testServiceA11 = scope1.Resolve<ITestServiceA>();

    var testServiceA12 = scope1.Resolve<ITestServiceA>();

    Console.WriteLine(object.ReferenceEquals(testServiceA11,testServiceA12));

    testServiceA15 = testServiceA12;

}

using (var scope1 = container.BeginLifetimeScope())

{

    var testServiceA13 = scope1.Resolve<ITestServiceA>();

    var testServiceA14 = scope1.Resolve<ITestServiceA>();

    Console.WriteLine(object.ReferenceEquals(testServiceA13,testServiceA14));

    testServiceA16 = testServiceA14;

}

Console.WriteLine(object.ReferenceEquals(testServiceA15,testServiceA16));

 

 

 

 

InstancePerMatchingLifetimeScope

同一个匹配的生命周期域中,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;且每个不匹配的生命周期域中的实例是唯一的,不共享的。

ContainerBuilder containerBuilder = new ContainerBuilder();

                    containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>().InstancePerMatchingLifetimeScope("Yak");

 

                    IContainer container = containerBuilder.Build();

 

                    ITestServiceA testServiceA15 = null;

                    ITestServiceA testServiceA16 = null;

                    using (var scope1 = container.BeginLifetimeScope("Yak"))

                    {

                        ITestServiceA testServiceA11 = scope1.Resolve<ITestServiceA>();

                        using (var scope2 = scope1.BeginLifetimeScope())

                        {

                            ITestServiceA testServiceA12 = scope2.Resolve<ITestServiceA>();

                            Console.WriteLine(object.ReferenceEquals(testServiceA11, testServiceA12));

                        }

                        testServiceA15 = testServiceA11;

                    }

 

                    using (var scope1 = container.BeginLifetimeScope("Yak"))

                    {

                        ITestServiceA testServiceA13 = scope1.Resolve<ITestServiceA>();

                        using (var scope2 = scope1.BeginLifetimeScope())

                        {

                            ITestServiceA testServiceA14 = scope2.Resolve<ITestServiceA>();

                            Console.WriteLine(object.ReferenceEquals(testServiceA13, testServiceA14));

                        }

 

                        testServiceA16 = testServiceA13;

                    }

                    Console.WriteLine(object.ReferenceEquals(testServiceA15, testServiceA16));

 

 

 

 

InstancePerOwned

在一个所拥有的实例创建的生命周期中,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;(较少使用)

InstancePerHttpRequest

同一次Http请求上下文中,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;仅适用于 ASP.NET (CORE) MVC 或 WebForm 应用程序

 

 

总结

Autofac可以返回一个单例 (SingleInstance ), 一个新的对象 (InstancePerLifetimeScope ) 或者在某种上下文环境中的单例。比如 一个线程 或者一个HTTP请求 (InstancePerHttpRequest )。

标签:Autofac,生命周期,container,实例,builder,Resolve,scope1,var
来源: https://www.cnblogs.com/yakniu/p/16273301.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有