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

问题描述 投票:0回答:1

我有一个Blazor服务,需要注入特定的“ LocalStorage”服务。通过这种方式完成:

 public class UserApi : IUserApi
    {
        private readonly LocalStorage _localStorage;

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

“ LocalStorage”被注入Startup.cs(ConfigureServices):

services.AddStorage();

((我认为可以安全地假设它应该正常工作)

我还通过以下行添加了自己的服务:

services.AddSingleton<IUserApi, UserApi>();

在剃须刀页面上,我注入了我的服务:

@inject IUserApi UserApi

并在那里访问功能:

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

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

System.AggregateException

内部例外1:

InvalidOperationException:验证服务时出错描述符'ServiceType:BlazorFood.IUserApi寿命:SingletonImplementationType:BlazorFood.UserApi':无法使用作用域服务来自的“ Cloudcrate.AspNetCore.Blazor.Browser.Storage.LocalStorage”单例“ BlazorFood.IUserApi”。

内部异常2:InvalidOperationException:无法使用作用域服务'Cloudcrate.AspNetCore.Blazor.Browser.Storage.LocalStorage'来自单例“ BlazorFood.IUserApi”

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

InvalidOperationException:无法提供属性值类型为“ BlazorFood.Pages.admin.Login”的“ UserApi”。没有类型为“ BlazorFood.IUserApi”的注册服务]

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

c# asp.net-core dependency-injection blazor blazor-server-side
1个回答
0
投票

错误消息的此部分

无法使用单例'BlazorFood.IUserApi'的作用域服务'Cloudcrate.AspNetCore.Blazor.Browser.Storage.LocalStorage'

也表示为frp,文档

从单例中解析作用域服务很危险。处理后续请求时,可能会导致服务的状态不正确。

参考Dependency injection in ASP.NET Core

不要让您的服务单例,应该解决该问题

services.AddScoped<IUserApi, UserApi>();
© www.soinside.com 2019 - 2024. All rights reserved.