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 или стандартный обработчик адаптера.

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