如何在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
相关产品推荐
相关产品推荐

