2014-11-14 5 views
11

डोमेन सेवा एक्सेस रिपोजिटरी कर सकते हैं? या उन्हें आवेदन सेवाओं द्वारा पास किए गए समेकन/संस्थाओं पर काम करना चाहिए?डोमेन सेवाओं का उपयोग कर सकते हैं 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) 
    } 
} 
+0

हां।एक डोमेन सेवा अभी भी एक ऑर्केस्ट्रेटर है, केवल विशेषज्ञता का क्षेत्र – MikeSW

+0

@ माइकएसडब्ल्यू का मतलब है "हां" "डोमेन सेवा एक्सेस रेपॉजिटरीज़" या "वे आवेदन सेवाओं द्वारा उन्हें एकत्रित समेकन/संस्थाओं पर काम करते हैं"? – mgryszko

+0

शीर्षक प्रश्न के लिए हाँ। – MikeSW

उत्तर

10

खैर, मैं कहूंगा कि अगर चुनने वाली संस्थाएं डोमेन लॉगी के अच्छे सौदे के लिए आती हैं सी, तो मैं उस कार्य को डोमेन सेवा में सौंप सकता हूं। हालांकि, मैं आमतौर पर आवेदन सेवाओं में कुल रूट संदर्भों को हल करने का प्रयास करता हूं।

हालांकि, मुझे लगता है कि आपके यहां कुछ अन्य समस्याएं हो सकती हैं या कम से कम आप अपने डिज़ाइन को बेहतर बनाने के लिए डोमेन ईवेंट जैसे कुछ अन्य डीडीडी सामरिक पैटर्न का उपयोग कर सकते हैं।

मेरी राय में, आपको आवेदन सेवा में कोड भेजने की कोई अधिसूचना नहीं होनी चाहिए। इसके बजाय, डोमेन सेवा द्वारा एक मनीट्रांस्फर डोमेन ईवेंट उठाया जा सकता है। इसके बाद आपके पास इस कार्यक्रम का ग्राहक होगा जो ईमेल भेजने के लिए प्रभारी होगा।

अपने घटकों को डीकॉप्लिंग करने के अलावा, आप अपने डोमेन की सर्वव्यापी भाषा को समृद्ध कर रहे हैं। एक अधिसूचना भेजना अब एक ही प्रक्रिया के हिस्से के बजाय किए गए धन हस्तांतरण के जवाब में होता है और कई अन्य इच्छुक पार्टियां भी प्रतिक्रिया दे सकती हैं।

अंत में, आपकी डोमेन सेवा वर्तमान में प्रति लेनदेन केवल एक समग्र रूट को संशोधित करने के नियम का उल्लंघन कर रही है। मैं यह नहीं कह रहा हूं कि आप कभी भी नियम तोड़ नहीं सकते हैं, लेकिन आम तौर पर यह एक अच्छा संकेतक है कि आपको अंतिम स्थिरता का उपयोग करना चाहिए, या शायद आपकी कुल सीमाएं गलत हैं।

यदि आप इसके बारे में सोचते हैं, तो खातों के बीच धन हस्तांतरण शायद ही कभी परमाणु तरीके से होता है (यदि वे कभी करते हैं)। मुझे लगता है कि यह मामला हो सकता है यदि दोनों खाते एक ही बैंक में हैं, लेकिन हस्तांतरण जब कई बैंकों को हस्तांतरित करता है तो अंतिम स्थिरता का उपयोग किया जाना चाहिए।

+0

उत्पादन कोड से लिया गया कुछ कोड के रूप में अपना नमूना कोड के रूप में न लें :)। मैं सिर्फ डोमेन सेवा - रिपोजिटरी वेरिएंट के लिए एक संदर्भ सेट करना चाहता था। – mgryszko

+0

@mgryszko ठीक है, डीडीडी में आप काल्पनिक डोमेन पर जवाब नहीं दे सकते हैं और फिर इसे अपने डोमेन पर लागू कर सकते हैं। सभी उत्तरों हमेशा "यह निर्भर करता है" पर आता है। आपके पास नियमों और दिशानिर्देशों का एक सेट है, लेकिन पत्थर में कभी भी सेट नहीं किया गया है। मैं जो कह रहा हूं वह यह है कि एप्लिकेशन सेवाओं को डोमेन सेवा में समेकित करना चाहिए, जब तक कि वह एप्लिकेशन सेवा में डोमेन तर्क को लीक न करे (उदा। उन निर्भरताओं को ढूंढना डोमेन नियमों पर आधारित है)। साथ ही, मैं जो कह रहा हूं वह यह है कि, यदि आप एक ही लेनदेन में कुल दोनों को संशोधित नहीं कर रहे थे, तो शायद आपको डोमेन सेवा की भी आवश्यकता नहीं होगी। – plalx

+2

ऐसा कोई नियम नहीं है कि केवल एक एआर को एक ही सेवा द्वारा संशोधित किया जाना चाहिए। – MikeSW

संबंधित मुद्दे

 संबंधित मुद्दे