有没有办法只刷新 DI 对象(Blazor 服务器)

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

我的 Blazor 服务器有问题:

我的 DI 在组件按钮单击时总是获得相同的 ID(实例)

DI

例如: ILoginService.ID =“123”

当我单击按钮时 - 如果登录失败,然后重试它将具有相同的实例 ID =“123”

依赖注入定义如下: DI Definition

我知道如果我刷新页面,DI 将按预期工作(因为它是范围服务 - 每个请求都是新的)。但这不适合我的场景。

我必须仅在单击按钮之前或之后刷新 DI 对象,因此每次单击按钮我都有一个新实例

有没有办法只刷新DI对象

已经将 DI 的生命周期更改为瞬态。仍然不工作 chnged

我期待以下内容

点击之前: ILoginService.ID =“123”

然后登录失败 重试点击 ILoginService.ID =“456”

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

在 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;
        }
    }
}

我的测试结果:

首先点击:

First click

第二次点击:

Second click

© www.soinside.com 2019 - 2024. All rights reserved.