Nhưng, điều gì sẽ xảy ra nếu một trong những sự kiện sẽ khiến một hệ thống bên ngoài không nằm trong tầm kiểm soát của bạn "vận chuyển một mặt hàng" cho khách hàng nếu bạn chỉ phát lại các sự kiện mà mặt hàng đó sẽ được vận chuyển hai lần.
Để chọn một ví dụ cụ thể, hãy xem xét cách tiếp cận "ít nhất một lần" đối với các tác dụng phụ có thể hoạt động.
State currentState = State.InitialState
for(Event e : events) {
currentState = currentState.apply(e)
}
for(SideEffect s : currentState.querySideEffects()) {
performSideEffect(s)
Vì vậy, mô hình miền theo dõi những gì cần phải được thực hiện; nhưng để lại thực tế cho ứng dụng
Trong bối cảnh chạy một lệnh, ý tưởng cơ bản trông giống nhau. Các tác dụng phụ thực tế xảy ra bên ngoài giao dịch cập nhật mô hình.
Vì vậy, các bài kiểm tra đơn vị cho mô hình của bạn có thể trông giống như
{
// Given
State currentState = State.InitialState
// When
Events events = List.of(OrderPlaced)
// Then
List.of(SendEmail) === currentState.applyAll(events).querySideEffects()
}
{
// Given
State currentState = State.InitialState
// When
Events events = List.of(OrderPlaced, EmailSent)
// Then
List.EMPTY === currentState.applyAll(events).querySideEffects()
}
Những điểm chính ở đây là
- Cập nhật mô hình là tác dụng phụ miễn phí; các tác dụng phụ thực tế xảy ra bên ngoài giao dịch cập nhật mô hình.
- Một sự kiện mô tả kết quả của tác dụng phụ cần phải quay lại.