首页 > 编程语言 >Asp.net core依赖注入服务生存期踩坑记录

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

时间:2024-06-17 21:59:33浏览次数:24  
标签:core Asp 服务 string set 生存期 net appState public

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 appState
    
appState.SetEquipId(Id);
appState.SetFactory(Factory);
Console.WriteLine("这里是home:{0}",appState);

//login.razor
@inject AppState appState
@inject UserAuthenticationStateProvider UserAuthenticationStateProvider
    
var 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

标签:core,Asp,服务,string,set,生存期,net,appState,public
From: https://www.cnblogs.com/ssz0312/p/18253290

相关文章

  • 大数据Kubernetes(简称K8s):架构、应用与优化
    文章目录大数据Kubernetes(简称K8s):架构、应用与优化一、介绍Kubernetes的历史和演进初始阶段发展阶段演进阶段K8s的核心概念和设计理念核心概念设计理念二、K8s架构深入解析架构、应用与优化主要组件和节点类型1.控制平面(Master节点)2.工作节点(Worker节点)控制平面和......
  • 跟着杨中科学习(七)EFCore(五)
    EFCore的异步异步方法大部分是定义在Microsoft.EntityFrameworkCore这个命名空间下EntityFrameworkQueryableExtensions等类中的扩展方法,记得using。如何异步遍历IQueryable使用ToListAsync()、ToArrayAsync()。但是注意结果集不要太大。foreach(varainawaitctx.Arti......
  • c# .Net 对象池
    对象池就是对象的容器,旨在优化资源的使用,通过在一个容器中池化对象,并根据需要重复使用这些池化对象来满足性能上的需求。当一个对象被激活时,便被从池中取出。当对象被停用时,它又被放回池中,等待下一个请求。对象池一般用于对象的初始化过程代价较大或使用频率较高的场景。在ASP.......
  • 深入解读Netty中的NIO:原理、架构与实现详解
    深入解读Netty中的NIO:原理、架构与实现详解Netty是一个基于Java的异步事件驱动网络应用框架,广泛用于构建高性能、高可扩展性的网络服务器和客户端。Netty的核心是基于JavaNIO(Non-blockingI/O)的,因此理解Netty的实现需要先了解JavaNIO的基本概念和机制。JavaNIO简介Jav......
  • 深入浅出Netty:高性能网络应用框架的原理与实践
    深入浅出Netty:高性能网络应用框架的原理与实践1.Netty简介Netty是一个基于Java的异步事件驱动的网络应用框架,广泛用于构建高性能、高可扩展性的网络服务器和客户端。它提供对多种协议(如TCP、UDP、SSL等)的支持,适用于各种网络通信场景。2.核心组件Channel:代表一个到远程......
  • 【K8s】专题五(3):Kubernetes 配置之 ConfigMap 与 Secret 异同
    以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号!目录一、相同点二、不同点一、相同点功能作用:ConfigMap与Secret都用于存储配置数据,以便Pod可以访问这些数据创建方式:ConfigMap与Secret都可以通过......
  • linux或者CentOS环境下安装.NET Core环境
    一、下载注册Microsoft密钥:在安装之前,需要:1、注册Microsoft密钥2、注册产品资料库3、安装所需的依赖项打开终端并输入命令:sudorpm-Uvhhttps://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm安装效果如下图所示:安装期间会提示用户验证,输......
  • Python使用.NET开发的类库来提高你的程序执行效率(包括.NET Framework、.NET Standard
    Python由于本身的特性原因,执行程序期间可能效率并不是很理想。在某些需要自己提高一些代码的执行效率的时候,可以考虑使用C#、C++、Rust等语言开发的库来提高python本身的执行效率。接下来,我演示一种使用.NET平台开发的类库,来演示一下Python访问.NET类库的操作实现。类库演示包括.......
  • 升级到.Net 8 api 返回JObject 对象为空字符串
    在使用dotnet8过程中,使用了JObject类型作为api的返回,但是返回的空数组api:[HttpGet("voices")]publicasyncTask<IActionResult>GetObject(){JObjectobj=newJObject();obj["test"]="test";returnnewJsonResult(obj){StatusCod......
  • C#开发的NoteNet桌面小贴士 - 开源研究系列文章 - 个人小作品
          十多年前编写过这个NoteNet小应用,不过当时用的是文本的保存方式,而且功能上也相对较多。这次重新编写这个小应用,用上新的技术和功能。现在先把源码发布出来,在另个系列的博文中(C#基于.netframework的应用开发实战编程(一)-编程手把手系列文章)将以此小应用为例子进行......