当前位置: 首页 > news >正文

autoFac 生命周期 试验

1.概述 autoFac的生命周期

序号名称说明
1InstancePerDependency每次请求都创建一个新的对象
2InstancePerLifetimeScope同一个Lifetime生成的对象是同一个实例
3SingleInstance每次都用同一个对象

2.注 InstancePerLifetimeScope

同一个Lifetime生成的对象是同一个实例,这个理解起来有点不确定,什么叫“同一个Lifetime生成的对象”,就是生成过的几次,比如在一个程序中,只调用一次生成。

var builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().InstancePerLifetimeScope();IContainer container = builder.Build();

只调用 一次,上面的注册,后面无论多少次获取,都是一个对象。

IA a = container.Resolve<IA>();

试验代码

 

class T2{static IContainer container;static T2(){var builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().InstancePerLifetimeScope();container = builder.Build();}public void fun(){for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}}}

3.那么“同一个Lifetime生成的对象”指创建过一次,那么这个创建指的是“InstancePerLifetimeScope”还是“Build”

于是有了下面的试验,“InstancePerLifetimeScope”一次,但是每次获取对象前都“Build”

builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().InstancePerLifetimeScope();
var container = builder.Build();

结果报了如下异常

 异常:

System.InvalidOperationException:“Build() or Update() can only be called once on a ContainerBuilder

 异常翻译:

System.InvalidOperationException: " Build()或Update()只能被ContainerBuilder调用一次

只能调用一次,那么“InstancePerLifetimeScope”和“Build”的调用次数只能是相同的,要么都同时一次,要么都同时多次。

完整代码

class T3{static ContainerBuilder builder;static T3(){builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().InstancePerLifetimeScope();}public void fun(){var container = builder.Build();for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}}}

4.另外两种生命周期,都很好理解,"SingleInstance"相当于单件,“InstancePerDependency”相当于每次都创建。(如果没有描述生命周,默认也是这个:builder.RegisterType<A>().As<IA>())

InstancePerDependency(每次使用都是一个新的对象)

static void Main(string[] args){Console.WriteLine();var builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().InstancePerDependency();IContainer container = builder.Build();for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}Console.ReadKey();}

 SingleInstance(多次获取使用的是一个对象)

static void Main(string[] args){Console.WriteLine();var builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>().SingleInstance();IContainer container = builder.Build();for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}Console.ReadKey();}

6.对比试验

生命周期对象中创建类中创建
InstancePerDependency每次获取的都是新对象每次获取的都是新对象
InstancePerLifetimeScope在创建对象的容器中是一个对象每次获取的都是新对象
SingleInstance在创建对象的容器中是一个对象每次获取的都是新对象

这里创建指:build

var builder = new ContainerBuilder();builder.RegisterType<A>().As<IA>())container = builder.Build();

这里的使用指:resolve

IA a = container.Resolve<IA>();a.fun();

在对象中创建,指在构造函数中创建,每创建一个对象,就创建一次。

在类中创建,指在静态类中创建,无论多少个类,指创建一次。

代码

using Autofac;
using Autofac.Builder;
using System;
using System.Collections.Generic;namespace autoFac生命周期2
{class Program{static void Main(string[] args){Console.WriteLine();Program p = new Program();p.main();Console.ReadKey();}private void main(){foreach (EnumLeftFun enumLeftFun in Enum.GetValues(typeof(EnumLeftFun))){T.enumLeftFunMy = enumLeftFun;Console.WriteLine("\n------------"+enumLeftFun+"--------------------------------");test1();test2();}//test3();}private void test1(){Console.WriteLine("    test1 每个对象创建一次");T1 t1 = new T1();t1.fun();T1 t2 = new T1();t2.fun();}private void test2(){Console.WriteLine("    test2 每个类创建一次");T2 t21 = new T2();t21.fun();T2 t22 = new T2();t22.fun();}private void test3(){T3 t3 = new T3();t3.fun();T3 t31 = new T3();t31.fun();}class T2 : T{static IContainer container;static T2(){var builder = new ContainerBuilder();T.leftSelect(builder.RegisterType<A>().As<IA>());container = builder.Build();}public void fun(){for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}}}class T3{static ContainerBuilder builder;static T3(){builder = new ContainerBuilder();T.leftSelect(builder.RegisterType<A>().As<IA>());}public void fun(){var container = builder.Build();for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}}}class T1:T{IContainer container;public T1(){var builder = new ContainerBuilder();leftSelect(builder.RegisterType<A>().As<IA>());builder.RegisterType<A>().As<IA>().SingleInstance();container = builder.Build();}public void fun(){for (int i = 0; i < 3; i++){IA a = container.Resolve<IA>();a.fun();}}}delegate IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> delegateFun(IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder);public enum EnumLeftFun{InstancePerDependency,InstancePerLifetimeScope,SingleInstance}class T{static Dictionary<EnumLeftFun, delegateFun> keyValuePairs = new Dictionary<EnumLeftFun, delegateFun>();public static EnumLeftFun enumLeftFunMy;static T(){keyValuePairs.Add(EnumLeftFun.InstancePerDependency, InstancePerDependency);keyValuePairs.Add(EnumLeftFun.InstancePerLifetimeScope, InstancePerLifetimeScope);keyValuePairs.Add(EnumLeftFun.SingleInstance, SingleInstance);}static public IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> leftSelect(IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder){return keyValuePairs[enumLeftFunMy](registrationBuilder);}static protected IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> InstancePerDependency(IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder){return registrationBuilder.InstancePerDependency();}static protected IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> InstancePerLifetimeScope(IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder){return registrationBuilder.InstancePerLifetimeScope();}static protected IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> SingleInstance(IRegistrationBuilder<IA, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder){return registrationBuilder.SingleInstance();}}}interface IA{void fun();}class A : IA{static int index = 0;private int myIndex;public A(){this.myIndex = ++index;}public void fun(){Console.WriteLine("myIndex:" + myIndex);}}
}

运行结果

------------InstancePerDependency--------------------------------test1 每个对象创建一次
myIndex:1
myIndex:1
myIndex:1
myIndex:2
myIndex:2
myIndex:2test2 每个类创建一次
myIndex:3
myIndex:4
myIndex:5
myIndex:6
myIndex:7
myIndex:8------------InstancePerLifetimeScope--------------------------------test1 每个对象创建一次
myIndex:9
myIndex:9
myIndex:9
myIndex:10
myIndex:10
myIndex:10test2 每个类创建一次
myIndex:11
myIndex:12
myIndex:13
myIndex:14
myIndex:15
myIndex:16------------SingleInstance--------------------------------test1 每个对象创建一次
myIndex:17
myIndex:17
myIndex:17
myIndex:18
myIndex:18
myIndex:18test2 每个类创建一次
myIndex:19
myIndex:20
myIndex:21
myIndex:22
myIndex:23
myIndex:24

http://www.lryc.cn/news/214970.html

相关文章:

  • foreach、for in 和for of的区别?
  • 【Effective C++】条款45: 运用成员函数模板接受所有兼容的类型
  • WSL1 安装 debian xfce 用xrdp 导入远程桌面
  • WPF RelativeSource属性-目标对象类型易错
  • Java while 和do while 循环
  • 应用软件安全编程--03净化传递给 Runtime.exec() 方法的非受信数据
  • uniapp阻止冒泡的方法,点击事件嵌套点击事件,怎么阻止同时触发
  • 【云原生基础】了解云原生,什么是云原生?
  • Android.bp探究
  • 【LeetCode】415 字符串相加
  • 【RP-RV1126】配置一套简单的板级配置
  • 解决uniapp的video标签和transition属性使用时出现错位的问题
  • 电脑校园杂志电脑校园杂志社电脑校园编辑部2023年第9期目录
  • NSSCTF做题第十页(1)
  • 文件详细操作过程(C语言)
  • python使用ffmpeg来制作音频格式转换工具(优化版)
  • Debug技巧-不启用前端访问后端
  • 由CAB/PAB展开的一些思考
  • 系列十五、idea全局配置
  • 高德Go生态建设与研发实践
  • SpringCloud中Turbine 1.X版本BUG
  • SCSS的用法有哪些?分别举例
  • Spring controller层请求数据和响应数据的简单方法
  • 中国商界杂志中国商界杂志社中国商界编辑部2023年第10期目录查询
  • 记录 vue + vuetify + electron 安装过程
  • 短视频账号矩阵系统saas源码搭建/技术
  • 词向量模型Word2Vec
  • 公会发展计划(GAP):经过实战考验的 Web3 任务模式
  • 网络工程师基础知识(2)
  • 创建ABAP数据库表和ABAP字典对象-理解表字段02