Blazor Server端在自定义类中使用ProtectedSessionStorage报空引用异常
问题原因
你遇到的空引用异常是因为[Inject]属性注入仅适用于Blazor框架托管的Razor组件,普通自定义类如果不是由依赖注入(DI)容器负责实例化,框架不会自动为[Inject]标记的属性赋值,你手动new FuncionesVarias()生成的实例中,SessionStorage属性始终为null,调用方法时就会抛出异常。
解决方案
方案1:使用构造函数注入(推荐)
- 第一步:修改自定义类,改为构造函数传入依赖
public class FuncionesVarias { private readonly ProtectedSessionStorage _sessionStorage; // 通过构造函数接收注入的SessionStorage public FuncionesVarias(ProtectedSessionStorage sessionStorage) { _sessionStorage = sessionStorage; } public async Task LeoSessionStorage() { var miSingleton = MiSingleton.Instancia; var result = await _sessionStorage.GetAsync<string>("SS"); miSingleton.ValorEnSesion = result.Success ? result.Value : string.Empty; } }
- 第二步:在项目的
Program.cs中注册该自定义类为服务
// 可根据业务需求选择AddScoped/AddTransient/AddSingleton builder.Services.AddScoped<FuncionesVarias>();
- 第三步:所有需要使用
FuncionesVarias的场景,都通过DI注入获取实例,不要手动new- Razor组件中使用:在组件顶部添加
@inject FuncionesVarias MisFunciones,直接调用MisFunciones.LeoSessionStorage()即可 - 其他自定义服务中使用:同样通过构造函数注入
FuncionesVarias实例
- Razor组件中使用:在组件顶部添加
方案2:手动传递服务提供器(仅特殊场景使用)
如果确实需要手动实例化FuncionesVarias,可以将IServiceProvider作为参数传入,手动解析出ProtectedSessionStorage实例,不推荐常规场景使用,容易导致服务生命周期管理混乱。
内容的提问来源于stack exchange,提问作者Nestor Vitozzi
相关产品推荐
相关产品推荐

