Есть ли способ обновить только объект DI (сервер Blazor)

У меня проблема с сервером Blazor:

мой DI всегда получает один и тот же идентификатор (экземпляр) при нажатии кнопки компонента

Например: ИЛогинСервис.ИД = "123"

Когда я нажимаю кнопку - если вход не удался, и повторите попытку, он будет иметь тот же идентификатор экземпляра = "123"

Внедрение зависимостей было определено ниже:

Я знаю, что если я обновлю страницу, DI будет работать как положено (потому что это служба области действия — новый каждый запрос). но это не соответствует моему сценарию.

Мне нужно обновить объект DI только до или после нажатия кнопки, поэтому у меня есть новый экземпляр при каждом нажатии кнопки.

Есть ли способ обновить только объект DI?

Уже изменил время жизни DI на переходное. Все еще не работает

Я ожидал следующего

Прежде чем нажать: ИЛогинСервис.ИД = "123"

Тогда вход не удался Повторить клик ILoginService.ID = "456"

Как вы устанавливаете идентификатор в своей службе входа в систему? Если это будет статическое поле, то по этой причине идентификатор будет таким же.

decius 09.08.2024 08:02

@decius это не статично, оно назначается динамически. НовыйГид. Это один и тот же идентификатор для каждого запроса на вход (повторная попытка), экземпляр не меняется, когда я проверяю идентификатор

Edison C 09.08.2024 09:05

Не могли бы вы поделиться кодом этой части LoginService?

decius 09.08.2024 09:21

Ваш сервис состоит из набора методов и нескольких объектов состояния. Выделите состояние в отдельный объект и обновите его. Внедряет ли служба другие службы?

MrC aka Shaun Curtis 09.08.2024 09:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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>();

Результаты моего теста:

Первый клик:

Второй щелчок:

Большой. Это работает..

Edison C 09.08.2024 13:01

Другие вопросы по теме

Похожие вопросы