我有一个依赖于AuthenticationStateProvider的服务。如果我使用AddScoped添加我的服务,它可以正常工作,如果我使用AddSingleton添加,当我的服务调用AuthenticationStateProvider的GetAuthenticationStateAsync方法时,我将收到异常。
在设置验证状态之前调用了获取验证状态异步。
我理解范围上的不同,但我不明白为什么id会对AuthenticationStateProvider产生影响。
我的服务:
public class MyService : IMyService
{
AuthenticationStateProvider _provider
public MyService(AuthenticationStateProvider provider)
{
_provider = provider
}
public async Task<MyObject> DoThingsAsyc()
{
\\Exception happens here
var user = (await _provider.GetAuthenticationStateAsync()).User;
...
}
}
Program.cs:
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<IMyService, MyService>();
1条答案
按热度按时间2g32fytz1#
当我们有一个作用域示例时,每次加载页面时,都会创建一个新的AuthenticationStateProvider示例并插入到MyService中。然而,当我们执行单例时,它会保持完全相同的示例(包括相同的AuthenticationStateProvider服务)。当我们将MyService设为单例时,这意味着无法在每次页面加载时创建AuthenticationStateProvider服务。
我们无法使用生存期较短的服务。作用域服务仅存在于每个请求中,而单例服务创建一次并共享示例。现在,应用中仅存在MyService的一个示例。但它希望依赖AuthenticationStateProvider,该示例是作用域的,并且是按请求创建的。尚未创建AuthenticationStateProvider服务,因此没有SetAuthenticationState。在MyService中,您使用
_provider.GetAuthenticationStateAsync()
在SetAuthenticationState之前调用GetAuthenticationStateAsync。因此,错误将继续。