Изучение
Изучение Ark DI
Неизменяемая регистрация, контекстное разрешение, Scope, владение, асинхронная инициализация и упорядоченное завершение.
Изучение Ark DI
Ark DI — среда объектного графа на чистом Dart. Она отвечает за композицию, но не за бизнес-логику и не создаёт скрытую глобальную точку доступа.
Начните с задачи
Приложение создаёт объекты в порядке зависимостей: конфигурацию до API-клиента, клиент до Repository, Repository до сервиса или UseCase. Одни объекты разделяются между потребителями, другие создаются на каждый запрос, третьи инициализируются асинхронно. Ресурсы необходимо закрывать в обратном порядке. Тестам и предпросмотрам функций нужны ограниченные подмены без изменения production-графа.
Ark DI фиксирует правила создания и жизненного цикла в неизменяемом контейнере:
Корень композиции регистрирует правила создания
↓
Resolver создаёт или возвращает зависимость по выбранной стратегии
↓
дочерний Scope может явно переопределить часть графа
↓
close ждёт активные разрешения и закрывает принадлежащие контейнеру объекты
Прикладные классы по-прежнему используют внедрение через конструкторы. Контейнер остаётся на границах композиции; обычный доменный и прикладной код не обращается к нему.
Выбор регистрации по времени жизни
| Задача | Регистрация |
|---|---|
| Уже существующий объект с явным владельцем | Instance |
| Новый краткоживущий объект для каждого запроса | Factory |
| Один объект при первом обращении | Lazy Singleton |
| Новый асинхронный объект для каждого запроса | Async Factory |
| Один общий асинхронно инициализируемый объект | Async Lazy Singleton |
Рекомендуемый порядок
- Начало работы — небольшой граф и его закрытие.
- Composition Root — место соединения конкретных типов.
- Регистрации и владение — способ получения и ответственность за жизненный цикл.
- Scope и переопределения — иерархия и разрешение сначала в локальной области.
- Асинхронное разрешение — повторные попытки и совместное ожидание одной выполняющейся инициализации.
- Жизненный цикл и завершение — активные разрешения и обратный порядок зависимостей.
Интеграция с Flutter образует отдельную ветку на основе ark_di_flutter.
Ark DI не требует единственного глобального Singleton-контейнера. Корневой Scope доступен приложениям, которым он нужен, а Scope функции, сессии, предпросмотра или теста сохраняет короткое время жизни явным.