Руководства
Связь Repository с UseCase Forge
Преобразование изменений Repository в обычные Command без связи пакетов на уровне зависимостей.
Связь Repository с UseCase Forge
В этом руководстве добавляется фоновое прикладное поведение без связи между пакетами. Repository по-прежнему отвечает за текущие доменные данные, а UseCase — за координацию работы. Небольшой объект связи, принадлежащий приложению, преобразует значимую фиксацию данных в типизированный Command.
Когда нужен Binding
Используйте его, если фиксация должна запустить независимую прикладную работу: перестроить поисковый индекс, обновить производные рекомендации, запланировать синхронизацию или сбросить кэш представления. Не создавайте отдельный объект связи только ради копирования данных Repository в ещё один объект состояния.
1. Определите прикладной Command
final class CatalogChanged extends UseCaseCommand {
const CatalogChanged(this.data);
final CatalogData data;
}
Command содержит доменный снимок, необходимый обработчику. Он не содержит Repository или StreamSubscription.
2. Оставьте преобразование в Application-слое
Binding принадлежит Application-слою, потому что именно он решает, какое изменение данных становится каким Command.
final class CatalogBinding {
CatalogBinding(CatalogRepository repository, CatalogUseCase useCase)
: _subscription = repository.stream.listen(
(data) => useCase.add(CatalogChanged(data)),
);
final StreamSubscription<CatalogData> _subscription;
Future<void> close() => _subscription.cancel();
}
Прямая подписка обрабатывает повтор текущего значения. Используйте stream.skip(1), если Command должны создаваться только для будущих фиксаций.
| Требование | Подписка |
|---|---|
| Обработать текущее значение и все последующие фиксации | repository.stream |
| Реагировать только на фиксации после создания объекта связи | repository.stream.skip(1) |
3. Передайте политику выполнения UseCase Forge
Слушатель не выполняет асинхронную бизнес-логику. Admission, debounce, throttle, группировка Execution, отмена, ошибки и диагностика остаются в UseCase Forge.
Если серию фиксаций необходимо объединить в одну операцию, настройте принимающий UseCase. Не добавляйте таймеры и флаги отмены в слушатель Stream.
4. Соберите и закройте в порядке зависимостей
final binding = CatalogBinding(repository, catalogUseCase);
// Работа приложения.
await binding.close();
await catalogUseCase.close();
await repository.close();
await remoteSource.close();
Binding закрывается первым, потому что ещё способен отправлять Command. UseCase закрывается до Repository, так как его Handler может читать данные. Технические источники закрываются последними своим внешним владельцем.
Чего не делает такая интеграция
- Ark Data Layer не импортирует UseCase Forge.
- UseCase Forge не импортирует Ark Data Layer.
- Repository не знает, какая фоновая операция его наблюдает.
- UseCase не становится владельцем данных Repository.
- Binding не скрывает политику конкуренции и завершения.