在我的.Net核心5(导入的支持文件v5.0.12)中,Blazor VS-2019解决方案中,我“有一个工作的‘客户’-(数据/应用程序)服务和Blazor页面来列出和CRUD客户记录(如预期的工作)。我为服务器项目和客户端项目创建了类似的'Vehicle‘文件(当然,更改模型字段-引用)。
还没有编译错误,当我试图显示"VehicleList"页面时,此错误出现在输出窗口中:
Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer100未处理异常呈现组件:无法为'MyCore5AppPWA.Client.Pages.VehicleList'.类型上的属性'_vehicleService'提供值没有'MyCore5AppPWA.Client.Services.IVehicleService'.类型的注册服务。'_vehicleService':不能为'MyCore5AppPWA.Client.Pages.VehicleList'.类型上的属性System.InvalidOperationException提供值没有类型为'MyCore5AppPWA.Client.Services.IVehicleService'.的注册服务在Microsoft.AspNetCore.Components.ComponentFactory.<>c__DisplayClass6_.g__Initialize|2(IServiceProvider serviceProvider,IComponent组件)
请注意上面的"...c__DisplayClass6_0..."符号,我对此很感兴趣(不知道这有什么意义)。我读过许多与这篇文章的主题有关的类似的问题/答案,但这些问题都没有纠正错误。
下面是Startup.cs文件的一个片段:
public void ConfigureServices(IServiceCollection services) {
_ = services.AddDbContext<AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DbConnection")));
services.AddScoped<ICustomerRepository, CustomerRepository>();
services.AddScoped<IVehicleRepository, VehicleRepository>();
services.AddControllersWithViews();
services.AddRazorPages();
services.AddScoped<WeatherForecastService>();
}下面是“VehicleList.razor”代码文件的片段。
//html... declarations.
@layout MainLayout
@page "/vehiclelist"
@using MyCore5AppPWA.Client.Services;
@using MyCore5AppPWA.Shared
//...html omitted...//
@code {
[Inject]
private IVehicleService _vehicleService { get; set; }
[Inject]
private NavigationManager navigationManager { get; set; } ...other code...在服务器-项目/控制器子文件夹中也有"CustomerController.cs“和"VehicleController.cs”。
由于我对Blazor/Core-5/PWA相当陌生,因此我得出结论,我缺少一些关于在PWA项目中添加新服务的内容。
欢迎您的意见和建议。谢谢约翰
发布于 2021-11-14 00:06:37
感谢@JOSEFtw所作的有益答复。这使我找到了这个问题的解决办法。
Blazor网络应用程序有一个服务器项目和一个客户端项目。问题和@JOSEFtw指出,“问题”是因为“Client.Services.IVehicleService”没有注册。
在我评论了@JOSEFtw之后,我认为@JOSEFtw试图告诉我的东西不在我的意识范围之内。我对VS-2019源文件进行了“搜索”,这些文件显示客户端服务已在客户端项目的Program.cs文件中注册。我通过搜索"CustomerService“文本发现了这一点,并在其中找到了它。通过添加对Program.cs文件的"IVehicleService,VehicleService”引用来解决问题,解决了问题,如下所示:
builder.Services.AddHttpClient<IVehicleService, VehicleService>(client => {
client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress);
});我错误地认为,“存储库”接口和实现类是在服务器的Startup.cs中注册的,它有新添加的车辆库引用,这是注册服务(甚至客户端服务--我很愚蠢)所必需的。但是我不知道Program.cs文件的注册客户端注册作为一个单独的注册过程。
我对Blazor和C#的较低知识促成了这个问题,并发表了@JOSEFtw的评论。当然,我们都从错误中吸取教训。多亏了所有人。
发布于 2021-11-13 17:25:17
在您的IVehicleService文件中注入一个VehicleList.razor。但是似乎您还没有在DI容器中注册过这个接口的实现吗?
没有'MyCore5AppPWA.Client.Services.IVehicleService类型的注册服务
有点像
services.AddScoped<IVehicleService, YourImplementation>();应该能解决。
请注意,您需要根据您的实现使用正确的生存期(Singleton、作用域或瞬态的)注册它。
发布于 2021-11-13 17:32:12
依赖注入问题通常在运行时出现,因为使用这些服务的类在运行时请求它们之前不会知道它们没有注册到容器中。在您的例子中,例外情况是说您忘记注册IVehicleService的实现。通过将.AddScoped<>调用到ConfigureServices方法,您可以像其他任何服务一样注册它。
https://stackoverflow.com/questions/69956586
复制相似问题