DryIo c ASP. Net Core 3.1 DbContext хранит в контейнере Scope - PullRequest
0 голосов
/ 12 апреля 2020

Я использую DryIo c (последняя версия выпуска) для внедрения зависимостей. В моем приложении (Asp. net Core 3.1) я использую Entity Framework. Мой AppDbContext ссылается на DbContext и реализует IDisposable. Я также использую шаблон UnitOfWork и класс одноразовый.

Эти два объекта объявлены как временные. Я следую документации DryIo c, которая объясняет контекст с объектами Transient Disposable: https://github.com/dadhi/DryIoc/blob/master/docs/DryIoc.Docs/ReuseAndScopes.md

Для моего AppDbContext я разрешаю эту службу вручную. То же самое для моего UnitOfWork. В конце я вызываю метод Dispose. Но эти два экземпляра не уничтожаются и хранятся в одноместном объеме контейнера DryIo c.

Я провел несколько тестов и использую JetBrain dotMemory. Мой тест - 100 раз вызвать метод

  • Контроллер вызовов
  • открыть UnitOfWork
  • создать AppDbContext
  • база данных вызовов для получения моих данных
  • закрытие / удаление объектов.

В конце у меня есть 100 раз мой AppDbContext и мой UnitOfWork в объеме контейнера:

enter image description here

Я перепробовал множество комбинаций создания контейнера, но каждый раз это одно и то же:

var container = new Container(rules =>
                rules.With(propertiesAndFields: request => request.ServiceType.Name.EndsWith("Controller") ? PropertiesAndFields.Auto(request) : null)
            //    .WithoutThrowOnRegisteringDisposableTransient()
            //    .WithTrackingDisposableTransients()
                .WithoutThrowIfDependencyHasShorterReuseLifespan())
            .WithDependencyInjectionAdapter(services);

Результат: память быстро растет из-за этих двух видов объектов, хранящихся в области действия.

Если я комментирую .WithoutThrowOnRegisteringDisposableTransient(), мой код все еще работает (я думал, что будет сгенерировано исключение)

Я также пытался объявить эти службы как Scoped ( для каждого запроса http), но это не работает, потому что я не создаю область для каждого запроса. (Выдается исключение, и область действия автоматически открывается для каждого веб-запроса Asp. Net Базовая структура).

Может быть, мне нужно располагать область в конце каждого запроса?

Как я мог форсировать разрушение объектов?

1 Ответ

0 голосов
/ 15 апреля 2020

Спасибо автору библиотеки, я нашел решение: https://github.com/dadhi/DryIoc/issues/261

...