如何在C#类中注入Blazor Session Storage服务?
普通C#类中注入Blazored SessionStorage的实现方法
首先确认你已经在Program.cs中完成了Blazored SessionStorage的前置服务注册:builder.Services.AddBlazoredSessionStorage();
Blazor原生的[Inject]特性默认仅对继承自ComponentBase的Razor组件类生效,普通C#类不会被DI容器自动扫描并注入属性值,所以直接加特性不会生效,可采用以下两种方案实现:
方案1:构造函数注入(最推荐)
普通C#类的标准注入方式,符合DI最佳实践:
- 第一步:在自定义C#类的构造函数中声明
ISessionStorageService参数,接收注入的实例
public class MyCustomService { private readonly Blazored.SessionStorage.ISessionStorageService _sessionStorage; // 构造函数注入,DI容器创建实例时自动传入对应服务 public MyCustomService(Blazored.SessionStorage.ISessionStorageService sessionStorage) { _sessionStorage = sessionStorage; } // 你的业务方法,可以直接使用_sessionStorage public async Task SetValueAsync(string key, string value) { await _sessionStorage.SetItemAsync(key, value); } }
- 第二步:在Program.cs中注册你的自定义服务,生命周期要和SessionStorage匹配(默认SessionStorage是Scoped,所以建议自定义服务注册为Scoped或Transient)
builder.Services.AddScoped<MyCustomService>(); - 后续使用时直接把
MyCustomService注入到组件或者其他服务中即可,无需手动处理SessionStorage的注入逻辑。
方案2:属性注入(需要手动触发)
如果你确实需要在普通C#类中使用[Inject]特性实现属性注入,可以通过Blazor提供的服务注入扩展方法手动触发:
- 第一步:自定义类中保留
[Inject]标记的属性
public class MyCustomClass { [Inject] public Blazored.SessionStorage.ISessionStorageService _sessionStorage { get; set; } // 其他业务逻辑 }
- 第二步:创建类实例时,通过
IServiceProvider调用InjectProperties扩展方法完成属性注入
示例(在Razor组件中使用的场景):
@inject IServiceProvider ServiceProvider @code { protected override void OnInitialized() { var myClass = new MyCustomClass(); // 手动触发注入,给所有[Inject]标记的属性赋值 ServiceProvider.InjectProperties(myClass); // 此时myClass._sessionStorage已经可以正常使用 } }
注意事项
- 不建议自定义服务注册为Singleton生命周期,会和默认Scoped的SessionStorage产生生命周期不匹配问题,导致异常
- 尽量优先使用构造函数注入,属性注入仅适合无法修改构造函数的特殊场景
- 不要手动创建需要注入的服务实例,优先通过DI容器获取实例,避免注入失效
内容的提问来源于stack exchange,提问作者Baba
相关产品推荐
相关产品推荐

