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