Руководства

Связь Repository с UseCase Forge

Преобразование изменений Repository в обычные Command без связи пакетов на уровне зависимостей.

v1.1.0Продвинутый уровеньark_data_layer

Связь Repository с UseCase Forge

В этом руководстве добавляется фоновое прикладное поведение без связи между пакетами. Repository по-прежнему отвечает за текущие доменные данные, а UseCase — за координацию работы. Небольшой объект связи, принадлежащий приложению, преобразует значимую фиксацию данных в типизированный Command.

Когда нужен Binding

Используйте его, если фиксация должна запустить независимую прикладную работу: перестроить поисковый индекс, обновить производные рекомендации, запланировать синхронизацию или сбросить кэш представления. Не создавайте отдельный объект связи только ради копирования данных Repository в ещё один объект состояния.

1. Определите прикладной Command

dart
final class CatalogChanged extends UseCaseCommand {
  const CatalogChanged(this.data);
  final CatalogData data;
}

Command содержит доменный снимок, необходимый обработчику. Он не содержит Repository или StreamSubscription.

2. Оставьте преобразование в Application-слое

Binding принадлежит Application-слою, потому что именно он решает, какое изменение данных становится каким Command.

dart
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. Соберите и закройте в порядке зависимостей

dart
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 не скрывает политику конкуренции и завершения.