如何将服务注入 Blazor?
Posted
技术标签:
【中文标题】如何将服务注入 Blazor?【英文标题】:How to inject a service into Blazor? 【发布时间】:2020-12-19 13:24:16 【问题描述】:我在尝试将某些服务注入客户端项目时遇到问题。在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) );
await builder.Build().RunAsync();
ConfigureServices(builder.Services);
public static void ConfigureServices(IServiceCollection services)
services.AddSingleton<IMetamaskInterop, MetamaskBlazorInterop>();
services.AddSingleton<MetamaskService>();
services.AddSingleton<MetamaskInterceptor>();
在一个新组件中,我尝试按如下方式注入这些服务:
@inject IJSRuntime JSRuntime;
@inject MetamaskService metamaskService;
@inject MetamaskInterceptor metamaskInterceptor;
但是这样做会给我一个错误,如下所示:
感谢任何帮助或指导。
【问题讨论】:
请将错误的相关部分直接作为文本(不仅仅是图像)包含在您的问题中。 【参考方案1】:您在启动应用程序后配置服务。
在await builder.Build().RunAsync();
之前添加ConfigureServices(builder.Services);
。
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) );
// configure services before running the app
ConfigureServices(builder.Services);
await builder.Build().RunAsync();
public static void ConfigureServices(IServiceCollection services)
services.AddSingleton<IMetamaskInterop, MetamaskBlazorInterop>();
services.AddSingleton<MetamaskService>();
services.AddSingleton<MetamaskInterceptor>();
【讨论】:
【参考方案2】:您不应将名为ConfigureServices
的新静态方法引入Program
类。这不是引发异常的原因,但它具有很大的误导性,因为 ConfigureServices
是 Startup 类中定义的方法的名称(过去在 WebAssembly Blazor 中使用,然后被删除......)。
有时,您可能需要第二种方法进行条件配置,但不要将其命名为ConfigureServices
。在当前实例中,您不需要第二种方法。只需按照下面的方式进行即可。
当你使用第二种方法时,你不能运行
await builder.Build().RunAsync();
当此代码构建并执行您的应用程序时,渲染它为时已晚,无法向服务集合添加更多服务。只需将 IServiceCollection 对象传递给第二个方法,当它返回时构建并运行您的应用程序。
这是您的代码的更新版本:
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) );
builder.Services.AddSingleton<IMetamaskInterop, MetamaskBlazorInterop>();
builder.Services.AddSingleton<MetamaskService>();
builder.Services.AddSingleton<MetamaskInterceptor>();
await builder.Build().RunAsync();
【讨论】:
以上是关于如何将服务注入 Blazor?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Blazor 类中注入服务(AuthenticationStateProvider)