Blazor客户端非Razor类中[Inject]属性始终返回null的问题
解决Blazor非Razor类中依赖注入的问题
你遇到的这个情况很常见——Blazor的[Inject]属性只对组件类(继承自ComponentBase的Razor页面/组件)生效,普通的服务、助手类并不会被框架自动处理属性注入,所以你才会拿到null。下面给你两种可行的解决方案,优先推荐第一种:
1. 使用构造函数注入(推荐)
这是.NET依赖注入体系的标准做法,也是最佳实践。你只需要把ISyncLocalStorageService作为类的构造函数参数,DI容器会自动帮你注入依赖实例。
示例代码如下:
public class MyCustomService { private readonly ISyncLocalStorageService _localStorage; // 通过构造函数接收依赖 public MyCustomService(ISyncLocalStorageService localStorage) { _localStorage = localStorage ?? throw new ArgumentNullException(nameof(localStorage)); } public void DoSomethingWithLocalStorage() { // 直接使用_localStorage即可,不会为null var value = _localStorage.GetItem<string>("myKey"); } }
别忘了要把你的自定义服务注册到DI容器中(通常在Program.cs里):
builder.Services.AddScoped<MyCustomService>();
之后不管是在Razor组件中用@inject MyCustomService MyService,还是在其他服务的构造函数中注入MyCustomService,它的_localStorage依赖都会被正确初始化。
2. 手动解析依赖(仅特殊场景使用)
如果因为某些限制无法使用构造函数注入(比如类是通过new手动实例化的),你可以从DI容器手动获取服务实例,但这种方式会增加代码耦合,不推荐常规使用。
比如在Razor组件中获取服务后传递给助手类:
@inject IServiceProvider ServiceProvider @code { private void UseHelperClass() { var localStorage = ServiceProvider.GetRequiredService<ISyncLocalStorageService>(); var helper = new MyHelperClass(localStorage); helper.DoWork(); } }
为什么[Inject]在非组件类中无效?
Blazor组件的生命周期由框架管理,框架会在组件初始化时自动扫描[Inject]属性并从DI容器中注入对应的服务。而普通的服务、助手类不会经过这个生命周期处理流程,.NET默认的DI容器也不支持自动的属性注入(除非手动配置,但这违背了DI的设计原则)。
内容的提问来源于stack exchange,提问作者ThatRickGuy
相关产品推荐
相关产品推荐

