如何在Blazor中注入服务?客户端项目服务注入报错求助
问题分析与解决方案
我一眼就发现问题所在啦——你服务配置的时机完全错了!
核心问题
你把ConfigureServices(builder.Services)的调用放在了await builder.Build().RunAsync();之后,这会导致两个致命问题:
RunAsync()是启动Blazor WebAssembly主机并阻塞当前线程的方法,后面的代码永远不会被执行- 就算它能执行,服务容器必须在主机
Build()之前配置完成,构建后的主机无法再添加新服务
修正后的代码
把服务配置的调用移到builder.Build()之前,调整后的Program.cs应该是这样:
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>(); } }
额外检查项
如果调整后还是报错,可以再确认这两点:
- 确保
MetamaskService、MetamaskInterceptor这些类是public访问修饰符,且没有私有构造函数(否则DI容器无法实例化它们) - 检查组件里的注入代码是否有拼写/大小写错误,比如
metamaskService的变量名是否和服务类匹配
内容的提问来源于stack exchange,提问作者jeissoni22
相关产品推荐
相关产品推荐

