C# 如何在Blazor服务器的后端正确使用依赖项注入?
我有一个Blazor服务,它需要一个特定的“本地存储”——注入服务。是这样做的:C# 如何在Blazor服务器的后端正确使用依赖项注入?,c#,asp.net-core,dependency-injection,blazor,blazor-server-side,C#,Asp.net Core,Dependency Injection,Blazor,Blazor Server Side,我有一个Blazor服务,它需要一个特定的“本地存储”——注入服务。是这样做的: public class UserApi : IUserApi { private readonly LocalStorage _localStorage; public UserApi(LocalStorage localStorage) { _localStorage = localStorage; } ...
public class UserApi : IUserApi
{
private readonly LocalStorage _localStorage;
public UserApi(LocalStorage localStorage)
{
_localStorage = localStorage;
}
...
}
“LocalStorage”被注入Startup.cs(ConfigureServices
):
(我认为可以安全地假设这是应该的)
我还使用以下行添加了我自己的服务:
services.AddSingleton<IUserApi, UserApi>();
并访问其中的功能:
private void HandleValidSubmit()
{
if (UserApi.Login( _loginUser.Mail, _loginUser.Password, out string error, out Guid? guid))
{
// DoMagic
}
}
当我尝试启动应用程序时,收到以下错误:
System.AggregateException
内部异常1:
InvalidOperationException:验证服务时出错
描述符的服务类型:BlazorFood.IUserApi生存期:Singleton
ImplementationType:BlazorFood.UserApi':无法使用作用域服务
“Cloudcrate.AspNetCore.Blazor.Browser.Storage.LocalStorage”来自
辛格尔顿“BlazorFood.IUserApi”
内部异常2:InvalidOperationException:无法使用作用域
服务'Cloudcrate.AspNetCore.Blazor.Browser.Storage.LocalStorage'
来自singleton'BlazorFood.IUserApi'
当我从ConfigureServices
中删除AddSingleton行时,我可以启动我的应用程序,但在尝试访问包含IUserApi注入的razor页面时检索到一个错误:
InvalidOperationException:无法为属性提供值
“BlazorFood.Pages.admin.Login”类型上的“UserApi”。没有
“BlazorFood.IUserApi”类型的注册服务
要正确注入我的服务,必须做些什么?错误消息的这一部分 无法使用单例“BlazorFood.IUserApi”中的作用域服务“Cloudcrate.AspNetCore.Blazor.Browser.Storage.LocalStorage” 如文件所示 从单例解析作用域服务是危险的。在处理后续请求时,可能会导致服务的状态不正确 参考文献 注册服务时不要将其设置为单例,这样可以解决问题
services.AddScoped<IUserApi, UserApi>();
services.addScope();
private void HandleValidSubmit()
{
if (UserApi.Login( _loginUser.Mail, _loginUser.Password, out string error, out Guid? guid))
{
// DoMagic
}
}
services.AddScoped<IUserApi, UserApi>();