如何在 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>();
我有一个需要注入特定 "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>();