डोमेन सेवा एक्सेस रिपोजिटरी कर सकते हैं? या उन्हें आवेदन सेवाओं द्वारा पास किए गए समेकन/संस्थाओं पर काम करना चाहिए?डोमेन सेवाओं का उपयोग कर सकते हैं Repositories?
एक ही व्यापार संचालन के दो कोड नमूने पर विचार करें - धन हस्तांतरण। पहले चरण के रूप में, मैं खाता शेष बदलता हूं। तब मैं अधिसूचना ईमेल प्राप्त करता हूं और अधिसूचना भेजता हूं। मुझे पता है, मुझे संभवतः अमूर्त तरीके से भेजे जाने वाले तरीके (ईमेल, एसएमएस, वाहक कबूतर) चाहिए, लेकिन सादगी के लिए आइए मान लें कि हम अभी तक केवल ईमेल का समर्थन करते हैं।
संस्करण 1 डोमेन सेवा के अंदर भंडार का उपयोग करता है। संस्करण 2 एप्लिकेशन सेवा में निर्भरता को हल करता है और उन्हें TransferDomainService
पर भेजता है।
इस उदाहरण में ऑपरेशन सरल है (एक खाते से धन घटाएं और इसे दूसरे में जोड़ें)। लेकिन यदि अधिक व्यवसाय नियम शामिल होंगे (संभवतः अधिक समेकित तक पहुंच की आवश्यकता है)? यदि संस्करण 2 लागू किया गया है, तो एप्लिकेशन सेवा में ज्ञान होना चाहिए कि वास्तव में डोमेन सेवा की आवश्यकता क्या है। यदि संस्करण 1 चुना जाता है, तो डोमेन सेवा रिपोजिटरी से पूछती है कि इसके कार्य को करने के लिए क्या आवश्यक है।
(नोट्स के टुकड़े के बारे में:। जावा DDD बिल्डिंग ब्लॉक के शब्दाडंबर पट्टी ग्रूवी कोड नामों में शामिल)
संस्करण 1
class TransferApplicationService {
def transferDomainService
def customerDomainService
def emailNotifierInfrastructureService
def transfer(fromAccount, toAccount, amount) {
transferDomainService.transfer(fromAccount, toAccount, amount)
def email = customerDomainService.accountNotificationEmail(toAccount)
emailNotifierInfrastructureService.notifyAboutTransfer(email, amount)
}
}
class TransferDomainService {
def accountRepository
def transfer(fromAccount, toAccount, amount) {
def from = accountRepository.findByNumber(fromAccount)
def to = accountRepository.findByNumber(toAccount)
to.decreaseBalance(amount)
from.increaseBalance(amount)
}
}
संस्करण 2
class TransferApplicationService {
def accountRepository
def transferDomainService
def customerDomainService
def notifierInfrastructureService
def transfer(fromAccount, toAccount, amount) {
def from = accountRepository.findByNumber(fromAccount)
def to = accountRepository.findByNumber(toAccount)
transferDomainService.transfer(from, to, amount)
def email = customerDomainService.accountNotificationEmail(toAccount)
notifierInfrastructureService.notifyAboutTransfer(email, amount)
}
}
class TransferDomainService {
def transfer(fromAccount, toAccount, amount) {
to.decreaseBalance(amount)
from.increaseBalance(amount)
}
}
हां।एक डोमेन सेवा अभी भी एक ऑर्केस्ट्रेटर है, केवल विशेषज्ञता का क्षेत्र – MikeSW
@ माइकएसडब्ल्यू का मतलब है "हां" "डोमेन सेवा एक्सेस रेपॉजिटरीज़" या "वे आवेदन सेवाओं द्वारा उन्हें एकत्रित समेकन/संस्थाओं पर काम करते हैं"? – mgryszko
शीर्षक प्रश्न के लिए हाँ। – MikeSW