लेकिन, क्या होगा अगर घटनाओं में से एक बाहरी प्रणाली को आपके नियंत्रण में न रखें ताकि ग्राहक को "एक आइटम जहाज" करें यदि आप घटनाओं को फिर से दोहराते हैं तो आइटम को दो बार भेज दिया जाएगा।
एक विशिष्ट उदाहरण चुनने के लिए, आइए विचार करें कि साइड इफेक्ट्स के लिए "कम से कम एक बार" दृष्टिकोण कैसे काम कर सकता है।
State currentState = State.InitialState
for(Event e : events) {
currentState = currentState.apply(e)
}
for(SideEffect s : currentState.querySideEffects()) {
performSideEffect(s)
इसलिए डोमेन मॉडल ट्रैक करता है कि क्या किया जाना चाहिए; लेकिन आवेदन करने के लिए वास्तविक कर छोड़ देता है
कमांड चलाने के संदर्भ में, मूल विचार समान है। वास्तविक साइड इफेक्ट मॉडल को अपडेट करने वाले लेनदेन के बाहर होता है ।
तो आपके मॉडल के लिए यूनिट परीक्षण कुछ ऐसा लग सकता है
{
// 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()
}
यहाँ मुख्य बिंदु हैं
- मॉडल को अपडेट करना साइड इफेक्ट फ्री है; वास्तविक दुष्प्रभाव मॉडल को अद्यतन करने वाले लेनदेन के बाहर होता है।
- साइड इफेक्ट के परिणाम का वर्णन करने वाली एक घटना को वापस आने की आवश्यकता है।