如何在 Blazor Server 的后端正确使用依赖注入?

How to properly use Dependency Injection in Backend in Blazor Server?

我有一个需要注入特定 "LocalStorage" 服务的 Blazor 服务。它是这样完成的:

 public class UserApi : IUserApi
    {
        private readonly LocalStorage _localStorage;

        public UserApi(LocalStorage localStorage)
        {
            _localStorage = localStorage;
        }
...
}

"LocalStorage" 被注入到 Startup.cs (ConfigureServices):

services.AddStorage();

(我认为可以安全地假设这会正常工作)

我还使用以下行添加了自己的服务:

services.AddSingleton<IUserApi, UserApi>();

在 razor-page 我注入了我的服务:

@inject IUserApi UserApi

并在那里访问一个函数:

  private void HandleValidSubmit()
    {
        if (UserApi.Login( _loginUser.Mail, _loginUser.Password, out string error, out Guid? guid))
        {
            // DoMagic
        }
    }

当我尝试启动我的应用程序时,我收到以下错误:

System.AggregateException

Inner Exception 1:

InvalidOperationException: Error while validating the service descriptor 'ServiceType: BlazorFood.IUserApi Lifetime: Singleton ImplementationType: BlazorFood.UserApi': Cannot consume scoped service 'Cloudcrate.AspNetCore.Blazor.Browser.Storage.LocalStorage' from singleton 'BlazorFood.IUserApi'.

Inner Exception 2: InvalidOperationException: Cannot consume scoped service 'Cloudcrate.AspNetCore.Blazor.Browser.Storage.LocalStorage' from singleton 'BlazorFood.IUserApi'

当我从 ConfigureServices 中删除 AddSingleton 行时,我可以启动我的应用程序,但在尝试访问包含 IUserApi-Injection 的 razor 页面时检索到错误:

InvalidOperationException: Cannot provide a value for property 'UserApi' on type 'BlazorFood.Pages.admin.Login'. There is no registered service of type 'BlazorFood.IUserApi'

要正确注入我的服务需要做什么?

这部分错误信息

Cannot consume scoped service 'Cloudcrate.AspNetCore.Blazor.Browser.Storage.LocalStorage' from singleton 'BlazorFood.IUserApi'

如文档中所述

It's dangerous to resolve a scoped service from a singleton. It may cause the service to have incorrect state when processing subsequent requests.

引用Dependency injection in ASP.NET Core

注册时不要将服务设置为单例,这应该可以解决问题

services.AddScoped<IUserApi, UserApi>();