无法识别Blazor托管启动程序集

时间:2020-10-21 16:11:52

标签: .net-core blazor

我正在构建一个Blazor应用程序(wasm和服务器),它们都共享一个API和一组服务。我将服务分解成自己的类库。大约有50种服务,我不想在“服务器”和“ WASM”配置部分中重复这些服务声明。

现状

WASM

public static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);
            builder.RootComponents.Add<App>("app");

            var zooAPI = new Uri("http://localhost:51552/api/v1/");

            builder.Services.AddHttpClient<IZooService, ZooService>(client => client.BaseAddress = zooAPI);

        await builder.Build().RunAsync();
    }

服务器

public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();

            var zooAPI = new Uri("http://localhost:51552/api/v1/");

            services.AddHttpClient<IZooService, ZooService>(client => client.BaseAddress = zooAPI);
        }

由于这两个都注册了服务,最终将超过50个服务id,因此希望在我的服务类库中添加启动。

[assembly: HostingStartup(typeof(Zoo.Services.ServicesStartup))]
namespace Zoo.Services
{
    public class ServicesStartup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            var zooAPI = new Uri("http://localhost:51552/api/v1/");

            builder.ConfigureServices((context, services) =>
            {
                services.AddHttpClient<IZooService, ZooService>(client => client.BaseAddress = zooAPI);
            });
        }

    }
}

我遇到的问题是无法识别此启动,并且未注册服务。异常为“处理请求时发生未处理的异常。InvalidOperationException:无法提供属性'ZooService'的值。没有IZooService类型的注册服务。

在启动应用程序时识别并注册此ServiceStartup我会丢失什么?

1 个答案:

答案 0 :(得分:0)

为了让Blazor应用知道要读取的HostingStartup,需要告诉它要检查的程序集。

对于Program.cs中的服务器托管,您可以添加StartupAssemblies键,也可以将其添加到环境变量ASPNETCORE_HOSTINGSTARTUPASSEMBLIES

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "Zoo.Services").UseStartup<Startup>();
                });

我还没有弄清楚如何将其添加到WASM中