如何将服务注入 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)

我应该像这样将服务工厂注入我的 Blazor 页面吗?

blazor wasm 如何从 di 注入自定义类

Blazor IStringLocalizer 向服务注入

将组件的依赖注入方法移动到 Blazor 服务器端中的分离 CS 库

Blazor University (45)依赖注入 —— 将依赖项注入 Blazor 组件