Blazor: HttpContext.RequestServices предоставляет экземпляр другой области, чем IServiceProvider - PullRequest
1 голос
/ 18 марта 2020

Мне нужно получить экземпляр Scoped из HttpContext.RequestServices (см .: Использование зависимостей Scoped в Singletons в ASP. NET Core ). Проблема в том, что на этапе рендеринга Blazor-сервера экземпляры, инжектированные в конструктор и возвращаемые из HttpContext.RequestServices.GetRequiredService, не совпадают.

Давайте создадим класс, для которого мы хотим иметь экземпляр в области действия

public class TestingClass {
    public int MyProperty { get; set; }
}

И потребительский класс

public class ResultClass {
    public string result;

    public ResultClass(TestingClass fromInjection, IHttpContextAccessor contextAccessor, IServiceProvider serviceProvider) {
        var fromRequest = contextAccessor.HttpContext.RequestServices.GetRequiredService<TestingClass>();
        var fromServiceProvider = serviceProvider.GetService<TestingClass>();
        var requestXinjection = (fromRequest == fromInjection);
        var serviceXinjection = (fromServiceProvider == fromInjection);
        result = $"Instance in from request and injection is the same {requestXinjection}. Instance in from request and service provider is the same {serviceXinjection}";
    }
}

И ConfigureServices

services.AddHttpContextAccessor();           
services.AddScoped<TestingClass>();
services.AddTransient<ResultClass>();

Теперь давайте вставим экземпляр ResultClass в страницу Razor и компонент Blazor (render-mode="ServerPrerendered" )

На странице Razor все три экземпляра одинаковы:

Экземпляр в запросе и внедрении одинаковый True. Экземпляр в запросе и поставщике услуг одинаков и инъекция та же истина. Экземпляр в запросе и поставщике услуг тот же True

В рендеринг блейзора фаза, когда внедренный экземпляр отличается от запроса:

Экземпляр из запроса и инъекции одинаковы Ложь . Экземпляр из запроса и поставщика услуг одинаков. True

По моему мнению, во всех случаях все три экземпляра должны быть одинаковыми. Это правда?

Неужели я неправильно интерпретирую поведение DI? Это ошибка?

Примечания

Когда я устанавливаю render-mode="Server", поведение такое же, как в фазе рендеринга (False, True).

Я использую asp. net -core-3.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...