Моя модель DbContext имеет ValueConverters,
protected override void OnModelCreating(ModelBuilder builder)
{
foreach (var entityType in builder.Model.GetEntityTypes())
{
foreach (var property in entityType.GetProperties())
{
// and somewhere deep:
property.SetValueConverter(myConverter);
Логика преобразования зависит от сеанса, поэтому мне необходимо получить доступ к HttpContext в процессе преобразования. Не проблема (я думал, что это наивно), класс MyConverter внедрит IHttpContextAccessor.
Тогда я понял, что для всех созданных dbcontexts будет выполняться только один раз OnModelCreating, потому что созданная модель кэшируется. Таким образом, фактически того же MyConverter, и именно поэтому один и тот же экземпляр IHttpContextAccessor будет называться всеми моими последующими преобразованиями, не имеет значения, как я его настраиваю (Singleton, Scoped или Transient) метод доступа One, который принадлежит Одна модель.
Вопрос
Я читал, что «хранилище резервных копий HttpContextAccessor является асинхронным локальным», но мне не ясно, можно ли использовать этот HttpContextAccessor, который вводится в какой-то самый первый запрос (когда модель создается сначала, один раз) в 100 дней спустя в другом запросе ...
PS: мне удалось заставить не кэшировать модель путем реализации IModelCacheKeyFactory, но, кроме того, что это очень уродливый хак, создание модели было слишком медленным каждый раз (более чем в 100 раз медленнее), я немедленно отбросил этот обходной путь