我的 Blazor 服务器有问题:
我的 DI 在组件按钮单击时总是获得相同的 ID(实例)
例如: ILoginService.ID =“123”
当我单击按钮时 - 如果登录失败,然后重试它将具有相同的实例 ID =“123”
我知道如果我刷新页面,DI 将按预期工作(因为它是范围服务 - 每个请求都是新的)。但这不适合我的场景。
我必须仅在单击按钮之前或之后刷新 DI 对象,因此每次单击按钮我都有一个新实例
有没有办法只刷新DI对象
我期待以下内容
点击之前: ILoginService.ID =“123”
然后登录失败 重试点击 ILoginService.ID =“456”
在 Blazor Server 中,组件可能会在单击按钮时重用组件的同一实例,这可能会影响服务实例的检索和管理。即使服务是暂时的,由于组件缓存机制,也可能不会创建新的服务实例。
因此,为了确保每次单击按钮都会获得一个新的
LoginService
实例,您可以使用 IServiceScopeFactory 创建一个新范围。
以下是我的测试演示:
登录服务:
public class LoginService : ILoginService
{
public string ID { get; private set; } = Guid.NewGuid().ToString();
// ...
}
登录.razor:
@page "/login"
@rendermode InteractiveServer
@inject IServiceScopeFactory ScopeFactory
<h3>Test</h3>
<button @onclick="HandleLogin">Login</button>
<p> ID: @id</p>
@code {
private string id;
private async Task HandleLogin()
{
using (var scope = ScopeFactory.CreateScope())
{
var loginService = scope.ServiceProvider.GetRequiredService<ILoginService>();
id = loginService.ID;
}
}
}
我的测试结果:
首先点击:
第二次点击: