autoFac 生命周期 试验
1.概述 autoFac的生命周期
| 序号 | 名称 | 说明 |
| 1 | InstancePerDependency | 每次请求都创建一个新的对象 |
| 2 | InstancePerLifetimeScope | 同一个Lifetime生成的对象是同一个实例 |
| 3 | SingleInstance | 每次都用同一个对象 |
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
相关文章:
autoFac 生命周期 试验
1.概述 autoFac的生命周期 序号名称说明1InstancePerDependency每次请求都创建一个新的对象2InstancePerLifetimeScope同一个Lifetime生成的对象是同一个实例3SingleInstance每次都用同一个对象 2.注 InstancePerLifetimeScope 同一个Lifetime生成的对象是同一个实例&#x…...
foreach、for in 和for of的区别?
forEach,for...in 和 for...of 是 JavaScript 中用于遍历数据的三种不同的结构。它们在遍历数组、对象和可迭代对象(如 Set 和 Map)时非常有用。尽管它们都可以用于循环遍历,但它们之间存在一些重要的区别: forEach&a…...
【Effective C++】条款45: 运用成员函数模板接受所有兼容的类型
假设有如下继承结构: class Top{}; class Middle: public Top{}; class Bottom: public Middle{};public继承意味着is-a关系,所有的基类都是派生类,但反之则不是,例如所有的学生都是人,但不是所有的人都是学生. 派生类到基类的指针可以直接隐式转换 Top* pt1 new Middle; T…...
WSL1 安装 debian xfce 用xrdp 导入远程桌面
凑合能用 晃晃行 晃晃不行 而且比较卡 还经常报崩溃 sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils apt install locales -y 安装过完应该会提示设置locales,如果安装完之后想要更改相关设置,可以使用如下命令重新设置loca…...
WPF RelativeSource属性-目标对象类型易错
上一篇转载了RelativeSource的三种用法,其中第二种用法较常见,这里记录一下项目中曾经发生错误的地方,以防自己哪天忘记了,又犯了同样错误—WPF RelativeSource属性-CSDN博客 先回顾一下: 控件关联其父级容器的属性—…...
Java while 和do while 循环
循环是程序中的重要流程结构之一。循环语句能够使程序代码重复执行,适用于需要重复一段代码直到满足特定条件为止的情况。 所有流行的编程语言中都有循环语句。Java 中采用的循环语句与C语言中的循环语句相似,主要有 while、do-while 和 for。 另外 Ja…...
应用软件安全编程--03净化传递给 Runtime.exec() 方法的非受信数据
每个 Java 应用都有一个 Runtime 类的实例, 一般需要使用 shell 时调用它,从而可以在 POSIX 中 使用/bin/sh 或者在Windows 平台中使用cmd.exe。 当参数中包含以空格、双引号或者其他以一/开头 的用来表示分支的字符时,就可能发生参数注入攻…...
uniapp阻止冒泡的方法,点击事件嵌套点击事件,怎么阻止同时触发
uniapp阻止冒泡的方法 当我们遇到点击事件嵌套点击事件的时候,点击里边的事件,外边的也会跟着触发该怎么办? 起初我尝试用了css里的修改z-index属性的方法,把里边的<view>标签放在上边,结果两个事件还是同时触发…...
【云原生基础】了解云原生,什么是云原生?
📑前言 本文主要讲了云原生的基本概念和原则的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句&#x…...
Android.bp探究
有时不知道Android.bp要咋写,特意看了下源码: ./build/soong/androidmk/androidmk/android.go 简单的Android.bp的模板是下面这个样子: [module type] {name: "[name value]",[property1 name]:"[property1 val…...
【LeetCode】415 字符串相加
415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 示例 1:…...
【RP-RV1126】配置一套简单的板级配置
文章目录 官方配置新建一套新配置新建板级pro-liefyuan-rv1126.mk配置文件新建一个Buildroot的defconfigs文件 吐槽:RP-RV1126 的SDK奇怪的地方make ARCHarm xxx_defconfig 生成的.config文件位置不一样savedefconfig命令直接替换原配置文件坑爹的地方 Buildroot上增…...
解决uniapp的video标签和transition属性使用时出现错位的问题
template:三个视频都每个占满屏幕,点击按钮滚动最外层bgBox元素, style: 想要加上动画过渡效果: 这是显示第一个视频: 点按钮向上滑动滚动到第二个视频时: 视频错位了 ,因为视频消失又出现的时候…...
电脑校园杂志电脑校园杂志社电脑校园编辑部2023年第9期目录
智慧校园 基于vue.js的“微校园”APP设计 吴秋伟 周慧 董锐 李仙云 余维 邓巧平 彭微1-3 探析AIGC对网络安全的革新:挑战与机遇共存 康良成 张朋4-6 文本信息自动摘要技术综述 滕宇飞7-9《电脑校园》投稿:cn7kantougao163.com 区块链应用于图书馆服务的策…...
NSSCTF做题第十页(1)
[GXYCTF 2019]禁止套娃 看源代码也没什么东西,扫一下看看 发现了git泄露 话不多说直接开整 下载下来了 flag.php 还是代码审计 <?php include "flag.php"; echo "flag在哪里呢?<br>"; if(isset($_GET[exp])){ if (!preg_…...
文件详细操作过程(C语言)
🌞🌞🌞千淘万漉虽辛苦🌞🌞🌞 🌞🌞🌞吹尽狂沙始到金🌞🌞🌞 🌇C语言文件操作 🍊文件的定义🍋什么是文…...
python使用ffmpeg来制作音频格式转换工具(优化版)
简介:一个使用python加上ffmpeg模块来进行音频格式转换的工具。 日志: 20231030:第一版,设置了简单的UI布局和配色,实现音频转为Mp3、AAC、wav、flac四种格式。可解析音频并显示信息,可设置转换后的保存路径 UI界面: 编程平台:visual studio code 编程语言:python 3…...
Debug技巧-不启用前端访问后端
在日常开发中,我们经常会遇到各种问题需要调试,前后端都启动需要耗费一定的时间和内存,方便起见,可以直接用抓包数据访问后端,这里我们需要用到Postman或者ApiFox 抓包数据 在系统前台触发后端请求,在控制…...
由CAB/PAB展开的一些思考
又到了一月保底一篇订阅号文章的时候,上周受到Oracle邀请,参加了在上海Oracle办公室举行的CAB(The 13th Oracle China Customer Advisory Board Metting)/ PAB(The 3th Oracle China Partner Advisory Board Metting&…...
系列十五、idea全局配置
一、全局Maven配置 IDEA启动页面>Customize>All settings>Build,Execution,Deployment>Build Tools>Maven 二、全局编码配置 IDEA启动页面>Customize>All settings>Editor>File Encodings 三、全局激活DevTools配置 IDEA启动页面>Customize>A…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
