Blazor Error: "There is no registered service of type" -- other StackOverflow questions do not solve

Blazor Error: "There is no registered service of type" -- other StackOverflow questions do not solve

在我的 .Net CORE 5(导入的支持文件 v5.0.12)Blazor PWA VS-2019 解决方案中,我“拥有”一个有效的 'Customer'-(data/app) 服务和 Blazor 页面以列出并增删改查客户记录(按预期工作)。我为 SERVER 项目和 CLIENT 项目创建了类似的 'Vehicle' 文件(当然更改了模型字段引用)。

还没有编译错误,当我尝试显示 "VehicleList" 页面时,这个错误出现在输出-window:

crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] Unhandled exception rendering component: Cannot provide a value for property '_vehicleService' on type 'MyCore5AppPWA.Client.Pages.VehicleList'. There is no registered service of type 'MyCore5AppPWA.Client.Services.IVehicleService'. System.InvalidOperationException: Cannot provide a value for property '_vehicleService' on type 'MyCore5AppPWA.Client.Pages.VehicleList'. There is no registered service of type 'MyCore5AppPWA.Client.Services.IVehicleService'. at Microsoft.AspNetCore.Components.ComponentFactory.<>c__DisplayClass6_0.g__Initialize|2(IServiceProvider serviceProvider, IComponent component)

请注意上面"...c__DisplayClass6_0..." 的表示法,我很好奇(不知道这有什么意义)。 我已经阅读了许多与此post主题相关的类似questions/answers,但未更正错误。

这是 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...

我在 SERVER-project/Controllers 子文件夹中还有一个“CustomerController.cs”和一个“VehicleController.cs”。

由于我是 Blazor/Core-5/PWA 的新手,因此我得出结论,我缺少有关向 PWA 项目添加新服务的内容。

非常欢迎您的意见和建议。谢谢约翰

您正在 VehicleList.razor 文件中注入 IVehicleService。但是你似乎没有在你的 DI 容器中注册这个接口的任何实现?

There is no registered service of type 'MyCore5AppPWA.Client.Services.IVehicleService

类似

services.AddScoped<IVehicleService, YourImplementation>();

应该可以解决。

请注意,您需要根据您的实现使用正确的生命周期(单一、作用域或瞬态)注册它。

依赖注入问题通常在运行时出现,因为使用这些服务的 class 在运行时请求它们之前不会知道它们没有注册到容器中。在您的情况下,例外情况是您忘记注册 IVehicleService 的实现。您可以通过调用 .AddScoped<> 到您的 ConfigureServices 方法来像注册任何其他服务一样注册它。

感谢@JOSEFtw 的有用回复。这让我找到了这个问题的答案。

Blazor PWA 网络应用程序有一个服务器项目和一个客户端项目。提出的问题和@JOSEFtw 指出 'issue' 与 'Client.Services.IVehicleService' 没有被注册。

在我与@JOSEFtw 发表评论后,我认为@JOSEFtw 试图告诉我的事情不在我的意识范围内。我对 VS-2019 源文件进行了“搜索”,这表明客户端服务已在 CLIENT 项目的 Program.cs 文件中注册。我通过搜索发现了这一点“CustomerService”文本,我在那里找到了它。通过将“IVehicleService、VehicleService”引用添加到 Program.cs,问题已解决文件如下:

builder.Services.AddHttpClient<IVehicleService, VehicleService>(client => {
            client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress);
         });

我错误地认为 'repository' 接口和实现 类 已在具有新添加的车辆存储库引用的服务器 Startup.cs 中注册,这就是注册所必需的服务(甚至是客户端服务——我太蠢了)。但是我不知道客户端注册的Program.cs文件作为一个单独的注册过程。

我对 Blazor PWA 和 C# 的了解不足导致了这个问题和@JOSEFtw 的评论。当然,我们都从错误中吸取教训。感谢大家。