如何将服务注入 Blazor?

问题描述

我在尝试将某些服务注入客户端项目时遇到问题。在 { set name(newname) { this.name = newname; },name: "name2" } 文件中,我有以下内容

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>();
        }
    }

但是这样做会给我一个错误,如下所示:

enter image description here

感谢任何帮助或指导。

解决方法

您是在启动应用程序后配置服务。

ConfigureServices(builder.Services); 前添加 await builder.Build().RunAsync();

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>();
    }
}
,

您不应在 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();
        }
    }