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

如何在Blazor中注入服务?客户端项目注入服务报错求助

问题分析与解决方案

你遇到的问题根源在于服务注册的时机错误,先看你Program.cs里的关键代码逻辑:

public static async Task Main(string[] args) { 
    var builder = WebAssemblyHostBuilder.CreateDefault(args); 
    builder.RootComponents.Add<App>("#app"); 
    builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); 
    await builder.Build().RunAsync(); 
    ConfigureServices(builder.Services); 
} 

await builder.Build().RunAsync();这行代码会直接构建并启动Blazor WebAssembly宿主实例,一旦宿主启动,服务容器就会被锁定,后续调用ConfigureServices注册的服务根本不会被添加到容器中——这就是组件注入时找不到服务、报错的核心原因。

修复方案

只需要把ConfigureServices的调用移到builder.Build()之前,确保所有服务在宿主构建完成前完成注册:

public class Program { 
    public static async Task Main(string[] args) { 
        var builder = WebAssemblyHostBuilder.CreateDefault(args); 
        builder.RootComponents.Add<App>("#app"); 
        builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); 
        
        // 先完成所有服务注册,再构建并启动宿主
        ConfigureServices(builder.Services);
        
        await builder.Build().RunAsync(); 
    } 
    public static void ConfigureServices(IServiceCollection services) { 
        services.AddSingleton<IMetamaskInterop, MetamaskBlazorInterop>(); 
        services.AddSingleton<MetamaskService>(); 
        services.AddSingleton<MetamaskInterceptor>(); 
    } 
}

额外补充说明

  • Blazor WebAssembly的服务注册逻辑必须在WebAssemblyHostBuilder.Build()执行前完成,因为构建宿主时会基于当前的服务容器创建所有依赖实例,后续注册的服务无法被宿主感知。
  • 服务注册的顺序不影响功能,但建议将自定义服务注册放在框架默认服务(比如HttpClient)之后,代码结构会更清晰。

内容的提问来源于stack exchange,提问作者jeissoni22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:53:11