You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:37:39