आइए कल्पना करें कि मेरे पास एक समूह और उपयोगकर्ता हैं और जब उपयोगकर्ता किसी समूह में शामिल होना चाहता है, तो मैं groupService.AddUserToGroup (समूह, उपयोगकर्ता) विधि को कॉल कर रहा हूं। DDD में मुझे group.JoinUser (उपयोगकर्ता) करना चाहिए, जो बहुत अच्छा दिखता है।
लेकिन डीडीडी आपको कार्यों को करने के लिए (स्टेटलेस) सेवाओं का उपयोग करने के लिए भी प्रोत्साहित करता है, अगर हाथ में काम बहुत जटिल है या एक इकाई मॉडल में फिट नहीं होगा। डोमेन लेयर में सेवाएं देना ठीक है। लेकिन डोमेन लेयर की सेवाओं में केवल व्यावसायिक तर्क शामिल होना चाहिए। दूसरी ओर बाहरी कार्य और एप्लिकेशन लॉजिक (जैसे ईमेल भेजना), एप्लिकेशन परत में डोमेन सेवा का उपयोग करना चाहिए, जिसमें आपके पास एक अलग (एप्लिकेशन-) सेवा हो सकती है, उदाहरण के लिए इसे लपेटकर।
समस्या यह है कि अगर मुझे कोई उपयोगकर्ता जोड़ने के लिए कुछ मान्यता नियम हैं ...
सत्यापन नियम डोमेन मॉडल से संबंधित हैं! उन्हें डोमेन ऑब्जेक्ट्स (संस्थाओं आदि) के अंदर इनकैप्सुलेट किया जाना चाहिए।
... या उपयोगकर्ता को समूह में जोड़ने पर कुछ बाहरी कार्यों को शुरू करने की आवश्यकता होती है। इन कार्यों के होने से इकाई को बाहरी निर्भरता प्राप्त होगी।
जबकि मुझे नहीं पता कि आप किस प्रकार के बाहरी कार्य के बारे में बात कर रहे हैं, मुझे लगता है कि यह कुछ ऐसा है जैसे ईमेल भेजना आदि लेकिन यह वास्तव में आपके डोमेन मॉडल का हिस्सा नहीं है। यह एप्लिकेशन लेयर में रहना चाहिए और वहां imho को लटका दिया जाना चाहिए। आपकी एप्लिकेशन परत में एक सेवा हो सकती है जो उन कार्यों को करने के लिए डोमेन सेवाओं और संस्थाओं पर काम करती है।
लेकिन यह तथ्य कि एक इकाई कुछ बाहरी सेवाओं / वर्गों पर निर्भर करती है, मुझे इतनी अच्छी और "स्वाभाविक" नहीं लगती।
यह अप्राकृतिक है और ऐसा नहीं होना चाहिए। इकाई को सामान के बारे में नहीं पता होना चाहिए जो इसकी जिम्मेदारी नहीं है। सेवाओं को ऑर्केस्ट्रेट इकाई इंटरैक्शन के लिए उपयोग किया जाना चाहिए।
DDD में इससे निपटने का उचित तरीका क्या है?
आपके मामले में, रिश्ते को संभवतः अप्रत्यक्ष होना चाहिए। क्या उपयोगकर्ता समूह में शामिल होता है या समूह उपयोगकर्ता को अपने डोमेन पर निर्भर करता है। क्या उपयोगकर्ता समूह में शामिल होता है? या उपयोगकर्ता को एक समूह में जोड़ा जाता है? यह आपके डोमेन में कैसे काम करता है?
वैसे भी, आपके पास एक द्विदिश संबंध है और इस प्रकार उन समूहों की मात्रा निर्धारित कर सकता है जो उपयोगकर्ता पहले से ही उपयोगकर्ता-कुल के भीतर हैं। चाहे आप उपयोगकर्ता को समूह में या समूह को पास कर दें, एक बार जब आप जिम्मेदार वर्ग को निर्धारित कर लेते हैं तो उपयोगकर्ता तकनीकी रूप से तुच्छ होता है।
सत्यापन तब संस्था द्वारा किया जाना चाहिए। पूरी चीज़ को एप्लिकेशन लेयर की एक सेवा से बुलाया जाता है जो तकनीकी सामान भी कर सकती है, जैसे ईमेल भेजना आदि।
हालाँकि, यदि सत्यापन तर्क वास्तव में जटिल है, तो एक डोमेन सेवा एक बेहतर समाधान हो सकती है। उस स्थिति में, वहाँ व्यापार नियमों को एनकैप्सुलेट करें और फिर इसे अपने एप्लिकेशन लेयर से कॉल करें।