Руководства
Диагностика одного Execution через DevTools
Подключите расширение, воспроизведите конфликт политик, проследите один Execution и раскройте только безопасные прикладные данные.
Диагностика одного Execution через DevTools
В этом руководстве мы превратим неясное сообщение «второе сохранение не запустилось» в проверяемое объяснение жизненного цикла. Расширение на протяжении всей диагностики работает только на чтение.
Установите инструмент разработки
Добавьте DevTools непосредственно в проверяемое приложение, а не только в другой пакет рабочего пространства.
dev_dependencies:
usecase_forge_devtools: ^0.1.0-dev.3
Получите зависимости и перезапустите приложение вместе с DevTools. Вызывать initialize() в приложении не требуется.
Создайте наблюдаемый конфликт политик
Предположим, SaveDocument использует идентификатор документа как executionKey и отклоняет новый Command, пока связанная работа активна.
registerCommand<SaveDocument>(
_save,
instructions: const UseCaseInstructionOverrides(
processing: UseCaseProcessingInstructionOverrides(
existingExecutionPolicy: UseCaseExistingExecutionPolicy.rejectNew,
),
),
);
Запустите сборку для разработки, отправьте два сохранения одного документа до завершения первого и не закрывайте UseCase при открытии DevTools.
Найдите самую раннюю видимую границу
Откройте вкладку UseCase Forge и выберите нужный UseCase. Читайте жизненный цикл по порядку:
- подтвердите точный тип Command и
executionKey; - проверьте, дошла ли вторая Execution Entry до
AdmissionилиPending; - изучите события отклонения, прежде чем связывать проблему со временем работы обработчика;
- найдите причину
activeConflictи политикуrejectNew; - убедитесь, что первый Execution продолжает работу независимо.
Отклонённый Command не попадает в конечную историю, потому что обработка не начиналась. Это часть контракта, а не потеря диагностических данных.
Проследите принятый Execution
Используйте идентификатор Execution, чтобы связать позиции, изменения Snapshot, события отмены, маршрут ошибки и конечную Execution Entry. Тип Command и ключ группы объясняют связь операций; отдельную попытку идентифицирует только Execution ID.
Раскройте безопасное диагностическое представление
Технические метаданные жизненного цикла доступны автоматически. Прикладные значения остаются скрытыми, пока UseCase явно не предоставит ограниченные данные, совместимые с JSON.
import 'package:usecase_forge/diagnostics.dart';
final class DocumentUseCase extends UseCase<DocumentState>
with UseCaseDiagnosticsDataProvider {
@override
String get useCaseDiagnosticLabel => 'Document editor';
@override
Object? encodeUseCaseDiagnosticValue(
UseCaseDiagnosticValueKind kind,
Object? value,
) {
if (kind == UseCaseDiagnosticValueKind.state && value is DocumentState) {
return {'dirty': value.isDirty, 'revision': value.revision};
}
return null;
}
}
Не раскрывайте содержимое документа, учётные данные, персональные сведения, неограниченные трассировки стека или полное содержимое сетевых сообщений. null оставляет значение скрытым.
Зафиксируйте результат диагностики
Полезное заключение называет наблюдаемые данные и владельца решения:
Второй
SaveDocumentотклонён с причинойactiveConflict. Оба Command имели одинаковый точный тип и ключ документа. Зарегистрированная политикаrejectNewсохранила первый активный Execution. Обработчик сохранения не получил второй Command.
После этого определите, соответствует ли продукту rejectNew, restart или coexist. DevTools доказывает, что произошло, но не выбирает политику продукта.
Продолжите с диагностикой очередей и политик, безопасными диагностическими данными и трассировкой маршрута Error.