Область применения в компонентах Middleware и Blazor - PullRequest
0 голосов
/ 11 февраля 2020

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

У меня есть служба CounterService, которая инициализирует счетчик в 1 и выставляет этот счетчик вместе с способ увеличить его. Действительно basi c:

public class CounterService
    {
        public int Counter { get; private set; }

        public CounterService()
        {
            Counter = 1;
        }

        public void IncrementCounter()
        {
            Counter++;
        }
    }

Затем я зарегистрировал этот счетчик в своем Startup.cs как сервис с областью действия: `services.AddScoped ()

Тогда у меня есть пользовательский ASP. NET промежуточное программное обеспечение, в данном случае «CounterInitializerMiddleware».

public class CounterInitializerMiddleware
    {

        public CounterInitializerMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public RequestDelegate _next { get; }

        public async Task Invoke(HttpContext context, CounterService counterService)
        {
            Console.WriteLine($"CounterInitializer invoked from request path: {context.Request.Path.Value}");
            counterService.IncrementCounter();
            counterService.IncrementCounter();
            await _next(context);
        }
    }

    public static class MiddlewareExtensions
    {
        public static IApplicationBuilder UseCounterInitializer(
            this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<CounterInitializerMiddleware>();
        }
    }

По сути, это средний уровень для увеличения счетчика, чтобы он начинался с 3, а не с 1, когда я получаю сервис, внедренный в мои компоненты. Я регистрирую его в моем Configure-методе в Startup.cs: `app.UseCounterInitializer ();

Этот промежуточный уровень вызывается 4 раза, когда я запускаю свое приложение (обратите внимание, что для RenderMode установлено значение ServerPreRendered) : При запросе загрузки страницы и при _blazor-запросах:

CounterInitializer invoked from request path: /counter
CounterInitializer invoked from request path: /_blazor/disconnect
CounterInitializer invoked from request path: /_blazor/negotiate
CounterInitializer invoked from request path: /_blazor

Служба с заданной областью введена, и все кажется хорошим.

Тогда, если у меня есть компонент с внедренным CounterService, кажется, что области видимости испорчены. Если я смотрю на метод OnInitialized, он вызывается дважды. Один раз во время предварительного рендеринга и один раз во время обычного рендеринга. При выполнении перед рендерингом CounterService имеет значение Counter, равное 3, как и ожидалось, поскольку оно прошло через CounterInitializerMiddleware. Однако во время выполнения рендера CounterService создается fre sh. Таким образом, кажется, что область нормального рендеринга и область (и) запросов, проходящих через промежуточное программное обеспечение, различны. Я думал, что область действия компонентов будет привязана к соединению "_blazor" -signalR, которое обрабатывается моим промежуточным программным обеспечением.

Любой, кто может выяснить, что происходит и помочь мне понять, как выполнить sh что я пытаюсь сделать?

Лучший, Матиас

РЕДАКТИРОВАТЬ: Просто чтобы уточнить. Мой реальный сценарий использования - это нечто совершенно иное, а контрпример - просто упрощенный пример, демонстрирующий проблему, и его легче воспроизвести (надеюсь).

...