Изучение

Начало работы

Установите usecase_forge и проведите типизированную команду через полный жизненный цикл.

v0.1.0-dev.2Начальный уровеньusecase_forge

Начало работы

Создадим UseCase счётчика. Пример невелик, но использует те же команду, контекст выполнения, снимок, конечную фазу и закрытие, что и производственная операция.

Требования

  • Dart SDK 3.12.2 или новее.
  • Dart-проект с pubspec.yaml.

Установка

Терминал
shell
dart pub add usecase_forge
lib/counter_usecase.dart
import 'package:usecase_forge/usecase_forge.dart';

State и Command

Состояние — прикладное значение. UseCase Forge не требует базового класса, но содержательное равенство предотвращает лишние публикации.

lib/counter_usecase.dart
final class CounterState {
  const CounterState(this.value);
  final int value;
  @override
  bool operator ==(Object other) =>
      other is CounterState && other.value == value;
  @override
  int get hashCode => value.hashCode;
}

final class Increment extends UseCaseCommand {
  const Increment({this.by = 1});
  final int by;
}

Команда описывает намерение. Она не выполняет сама себя и не хранит состояние интерфейса.

Регистрация обработчика Command

lib/counter_usecase.dart
final class CounterUseCase extends UseCase<CounterState> {
  CounterUseCase() : super(initialState: const CounterState(0)) {
    registerCommand<Increment>(_increment);
  }

  Future<void> _increment(
    Increment command,
    UseCaseExecutionContext<CounterState> context,
  ) async {
    final current = context.snapshot.state.value;
    context.publish(CounterState(current + command.by));
  }
}

Регистрация связывает тип команды с обработчиком. context.snapshot предоставляет снимок текущего выполнения, а context.publish проводит новое состояние через упорядоченный вывод.

Выполнение и закрытие

bin/main.dart
Future<void> main() async {
  final counter = CounterUseCase();
  final finished = counter.stream.firstWhere(
    (snapshot) => snapshot.phase == UseCaseExecutionPhase.finished,
  );
  counter.add(const Increment(by: 2));
  await finished;
  print(counter.state.state.value);
  await counter.close();
}

add передаёт намерение. Владелец наблюдает жизненный цикл через снимки и дескрипторы выполнения, а затем обязан дождаться close.

ARKTELOS

Инженерные системы для программного обеспечения, которое обязано выдерживать нагрузку.