Skip to content

Ошибки ​

InferDI сообщает об ошибках при неверном использовании графа и нарушении правил жизненного цикла. Не подавляйте эти сообщения в тестах: так ошибки регистрации обнаружатся раньше.

Что произошлоФорма сообщения
.get(k) для отсутствующего ключаKey "k" not found
Получение сервиса из освобождённого контейнераContainer is disposed (key: "k")
Получение сервиса через освобождённого предкаAncestor container is disposed (key: "k")
createScope() после освобождения ресурсовCannot create scope from a disposed container
Регистрация после освобождения ресурсовCannot register on a disposed container (key: "k")
Получение scoped-сервиса из корневого контейнера при fast: falseScoped "k" cannot be resolved from the root container. Use createScope().
Нарушение времени жизни singletonSingleton "x" cannot depend on scoped "y"...
Синхронный циклCircular dependency detected: a -> b -> a...
Синхронное освобождение для асинхронного ресурсаSync [Symbol.dispose] called on a resource whose .dispose() returned a Promise...
Синхронное освобождение закэшированной асинхронной инициализацииSync [Symbol.dispose] called on a container that cached a Promise from an async factory...
Поздняя подменаCannot override "k" because it has already been resolved...
Подмена в освобождённом контейнереCannot override on a disposed container (key: "k")

Перед сообщением об ошибочном использовании синхронное освобождение ресурсов добавляет обработчик отклонения к закэшированному нативному Promise. Поздняя ошибка не попадёт в unhandledRejection, но этот путь всё равно не может дождаться ресурса и освободить его. У пользовательских Promise-подобных объектов метод .then() не вызывается.

При асинхронном освобождении ресурсов зависимость и зависящие от неё регистрации могут отклонить Promise с одним объектом Error. InferDI сообщает этот объект один раз. Разные объекты остаются отдельными причинами AggregateError, даже если их сообщения совпадают.

Циклы асинхронных фабрик ​

Декларативные зависимости из registerAsyncFactory(..., deps, ...) проходят синхронную предварительную проверку, поэтому существующая проверка циклов отклоняет цикл до запуска тела фабрики.

Циклы после Promise-границы не детектируются. Это относится к функциям, возвращающим Promise в registerFactory, и к захваченным контейнерам, которые используются после await. Если обе стороны ждут друг друга, вызывающий код получает Promise, который никогда не завершится.

Устраняйте асинхронные циклы на уровне архитектуры:

  • разделите общую инициализацию
  • вынесите одну из зависимостей в сервис, который инициализируется раньше
  • используйте Lazy<singleton> только для синхронных singleton-зависимостей
  • добавьте тайм-аут на время разработки для подозрительных ожиданий на верхнем уровне

Ошибки очистки в адаптерах ​

Ошибки очистки в адаптере после уже созданного ответа никогда не показываются клиенту. Они уходят в onDisposeError или стандартный обработчик адаптера.

При сбое настройки наружу передаётся только исходная ошибка настройки. Если последующая очистка тоже завершилась ошибкой, та поступает в обработчик ошибок и не добавляется к исходной.