我正在构建一个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我会丢失什么?
答案 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中