Ошибки
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: false | Scoped "k" cannot be resolved from the root container. Use createScope(). |
| Нарушение времени жизни singleton | Singleton "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 или стандартный обработчик адаптера.
При сбое настройки наружу передаётся только исходная ошибка настройки. Если последующая очистка тоже завершилась ошибкой, та поступает в обработчик ошибок и не добавляется к исходной.
