Asp.net core依赖注入服务生存期踩坑记录

news/2024/10/2 3:15:20

Asp.net core依赖注入服务生存期踩坑记录

写在开头

今天我本想实现组件全局共享数据(状态管理),保存工厂名,用户登录id,设备编码等字段,以便全局共享。

但我在a组件设置的值到了b组件就不见了。

遇到的问题,与依赖注入服务生存期有关,我们知道依赖注入服务一共有三种:

AddScoped:作用域

AddTransient:瞬时

AddSingleton:单例

内容

set state,在另一个组件中点击事件打印state


public record AppState
{public string Factory { get; private set; }public string UserId { get; private set; }public string EquipId { get; private set; }public void SetFactory(string factory){if (string.IsNullOrWhiteSpace(factory))return;Factory = factory;}public void SetUserId(string userId){if (string.IsNullOrWhiteSpace(userId))return;UserId = userId;}public void SetEquipId(string equipId){if (string.IsNullOrWhiteSpace(equipId))return;EquipId = equipId;}
}
//program.cs
builder.Services.AddScoped<AppState>();//Home.razor
@inject AppState appStateappState.SetEquipId(Id);
appState.SetFactory(Factory);
Console.WriteLine("这里是home:{0}",appState);//login.razor
@inject AppState appState
@inject UserAuthenticationStateProvider UserAuthenticationStateProvidervar a = await UserAuthenticationStateProvider.GetAuthenticationStateAsync();
appState.SetUserId(a.User.FindFirst("EmployeeNo").Value);
Console.WriteLine("这里是login:{0}",appState);
navMan.NavigateTo($"/{appState.Factory}/{appState.EquipId}",true);//跳转回home

可以看到,数据不见了

罪魁祸首则是NavigateTo方法的true参数

翻阅微软文档,以下解释:

如果为 true,则绕过客户端路由并强制浏览器从服务器加载新页面,无论 URI 是否通常由客户端路由器处理。

强制加载页面,那么也就是在这里点击了刷新或者直接修改路由进行导航,它的scoped就改变了

那么去掉true,让路由帮我们完成:

发现状态获取成功

此时新开一个标签页:http://localhost:5000/DP10/888

打印出的结果与之前不同了,可我们在原先第一个标签页,也就是http://localhost:5000/DP02/123,打印出的结果仍是DP02,由此可知,作用域仅限于当前标签页

"对于 Web 应用,指定了作用域的生存期指明了每个客户端请求(连接)创建一次服务。"


接下来我们测试singleton

发现不管在哪里设置,在哪里获取,都是同步的,举个例子:

a用户登录系统,设置userid为a,b用户登录系统,设置userid为b,此时,a用户的userid也变成了b

"来自依赖关系注入容器的服务实现的每一个后续请求都使用同一个实例。"


最后,是transient:

state 即用即弃,也会造成a页面赋了值,b页面拿不到的情况

"在处理请求的应用中,在请求结束时会释放暂时服务。 此生存期会产生每个请求的分配,因为每次都会解析和构建服务。"

写在最后

不同的服务适用于不同的业务:

如果我是保存用户数据,显然是scoped

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/44886.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

mysql手册

查看mysql的配置文件位置 mysql --help | grep "Default options" -C 1输出如下,可知mysql读取默认选项的位置修改mysql cmd提示符 修改提示符有两种方法配置文件 prompt命令 在mysql cmd中使用prompt [text]设置提示符格式对于不是控制字符的字符,则原样输出 单独…

面经梳理-java多线程基础

梳理java多线程基础相关面经题目 线程和进程的概念?守护线程是干什么的?常见的守护线程有哪些? 线程和进程的概念 进程是程序的运行实例,是程序向操作系统申请资源的基本单位,线程是进程的一条执行路径。 Java的线程分为两种:用户线程和守护线程。守护线程作用是为其他线…

VSCode 中 Vue3:找不到模块 “./XXX.vue” 或其相应的类型声明

问题! 代码可以正常运行,但 VSCode 报错: 找不到模块 “./App.vue” 或其相应的类型声明别再去愚昧的添加 d.ts 啦! 只需在 VSCode 安装 TypeScript Vue Plugin (Volar) 拓展享受完全体的 Vue 导入!

面经梳理--java

梳理java相关面经题目 Java创建一个对象的方法有几种?使用new关键字 反射 (1)使用Class类的newInstance方法,只能无参构造器Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();或者(目前Class.newInstance()这…

VSCode远程开发配置SSH密钥免密登录

VSCode远程开发配置SSH密钥免密登录 ssh-key-deploy为开源软件,嫌弃报毒,请勿使用 ssh-key-deploy为开源软件,嫌弃报毒,请勿使用 ssh-key-deploy为开源软件,嫌弃报毒,请勿使用 下载ssh-key-deploy SSH密钥生成部署工具 ssh-key-deploy GitHub仓库:https://github.com/ik…

用Xpath制作简单的爬取网页工具,获取神奇宝贝百科每只精灵的信息

最近开始学习Python的爬虫应用,个人比较喜欢用Xpath的方式来爬取数据,今天就结合一下Xpath方式,以“神奇宝贝百科”为素材,制作一个爬取每只宝可梦数据的工程项目 准备工作 神奇宝贝百科地址:https://wiki.52poke.com/wiki/主页 工程项目的目标是,获取每只精灵的名字、编…

LeetCode 2268. Minimum Number of Keypresses

原题链接在这里:https://leetcode.com/problems/minimum-number-of-keypresses/description/ 题目: You have a keypad with 9 buttons, numbered from 1 to 9, each mapped to lowercase English letters. You can choose which characters each button is matched to as lo…

kafka事务流程

流程kafka事务使用的5个API // 1. 初始化事务 void initTransactions(); // 2. 开启事务 void beginTransaction() throws ProducerFencedException; // 3. 在事务内提交已经消费的偏移量(主要用于消费者) void sendOffsetsToTransaction(Map<TopicPartition,OffsetAndMetad…