У меня проблема с сервером Blazor:
мой DI всегда получает один и тот же идентификатор (экземпляр) при нажатии кнопки компонента
Например: ИЛогинСервис.ИД = "123"
Когда я нажимаю кнопку - если вход не удался, и повторите попытку, он будет иметь тот же идентификатор экземпляра = "123"
Внедрение зависимостей было определено ниже:
Я знаю, что если я обновлю страницу, DI будет работать как положено (потому что это служба области действия — новый каждый запрос). но это не соответствует моему сценарию.
Мне нужно обновить объект DI только до или после нажатия кнопки, поэтому у меня есть новый экземпляр при каждом нажатии кнопки.
Есть ли способ обновить только объект DI?
Уже изменил время жизни DI на переходное. Все еще не работает
Я ожидал следующего
Прежде чем нажать: ИЛогинСервис.ИД = "123"
Тогда вход не удался Повторить клик ILoginService.ID = "456"
@decius это не статично, оно назначается динамически. НовыйГид. Это один и тот же идентификатор для каждого запроса на вход (повторная попытка), экземпляр не меняется, когда я проверяю идентификатор
Не могли бы вы поделиться кодом этой части LoginService?
Ваш сервис состоит из набора методов и нескольких объектов состояния. Выделите состояние в отдельный объект и обновите его. Внедряет ли служба другие службы?
В 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;
}
}
}
Также зарегистрируйте службу как:
builder.Services.AddScoped<ILoginService, LoginService>();
Результаты моего теста:
Первый клик:
Второй щелчок:
Большой. Это работает..
Как вы устанавливаете идентификатор в своей службе входа в систему? Если это будет статическое поле, то по этой причине идентификатор будет таким же.