Я использую 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 в объеме контейнера:
Я перепробовал множество комбинаций создания контейнера, но каждый раз это одно и то же:
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 Базовая структура).
Может быть, мне нужно располагать область в конце каждого запроса?
Как я мог форсировать разрушение объектов?