Был случай, когда время жизни класса в IoC указали неправильно. Поставили Transient, объект создавался по каждому запросу, а надо было Scoped, один экземпляр на веб-запрос. Проблема была в том, что класс реализовывал IDisposable. IoC-контейнер такие ссылки хранил у себя, чтобы освобождать при закрытии скоупа. Transient означает, что все эти объекты складываются в корневом скоупе. В общем, они там копились и не освобождались, потому что скоуп эти ссылки помнил. Альтернативно можно было поменять поведение контейнера, чтобы не запоминал IDisposable-объекты.