Мне нужно получить экземпляр 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