मैं वर्तमान में एक प्रोजेक्ट पर कुछ कोड रीफैक्टर कर रहा हूं जो लपेट रहा है, और मैंने डोमेन ऑब्जेक्ट्स की बजाय सेवा कक्षाओं में बहुत से व्यवसाय तर्क डालने को समाप्त कर दिया। इस बिंदु पर अधिकांश डोमेन ऑब्जेक्ट केवल डेटा कंटेनर हैं। मैंने सेवा ऑब्जेक्ट्स में अधिकांश व्यावसायिक तर्क लिखने का फैसला किया था, और बाद में सब कुछ बेहतर, अधिक पुन: प्रयोज्य और अधिक पठनीय आकार में दोबारा रिफैक्टर कर दिया था। इस तरह से मैं तय कर सकता हूं कि डोमेन ऑब्जेक्ट्स में कौन सा कोड रखा जाना चाहिए, और कौन सा कोड स्वयं की नई वस्तुओं में फंस जाना चाहिए, और सेवा वर्ग में कौन सा कोड छोड़ा जाना चाहिए।डोमेन-संचालित डिज़ाइन में, क्या यह डोमेन ऑब्जेक्ट में अन्य ऑब्जेक्ट्स रिपोस्टीरीज को कॉल करने के लिए डीडीडी का उल्लंघन होगा?
public decimal CaculateBatchTotal(VendorApplicationBatch batch)
{
IList<VendorApplication> applications = AppRepo.GetByBatchId(batch.Id);
if (applications == null || applications.Count == 0)
throw new ArgumentException("There were no applications for this batch, that shouldn't be possible");
decimal total = 0m;
foreach (VendorApplication app in applications)
total += app.Amount;
return total;
}
इस कोड जैसे कि यह एक डोमेन वस्तु के लिए एक अच्छा इसके अतिरिक्त होगा लगता है, क्योंकि यह केवल इनपुट पैरामीटर डोमेन वस्तु ही है: तो मैं कुछ कोड है। कुछ रिफैक्टरिंग के लिए एक आदर्श उम्मीदवार की तरह लगता है। लेकिन एकमात्र समस्या यह है कि यह ऑब्जेक्ट किसी ऑब्जेक्ट की रिपोजिटरी को कॉल करता है। जो मुझे सेवा कक्षा में छोड़ना चाहता है।
मेरे सवालों का इस प्रकार हैं:
- कहाँ आप इस कोड डाल होगा?
- क्या आप इस फ़ंक्शन को तोड़ देंगे?
- सख्त डोमेन-संचालित डिज़ाइन का अनुसरण करने वाले किसी व्यक्ति को कहां रखा जाएगा?
- क्यों?
आपके समय के लिए धन्यवाद।
संपादित करें नोट: इस पर एक ओआरएम का उपयोग नहीं कर सकता, इसलिए मैं आलसी लोडिंग समाधान का उपयोग नहीं कर सकता।
नोट 2 संपादित करें: मैं पैरामीटर में लेने के लिए कन्स्ट्रक्टर को बदल नहीं सकता, क्योंकि डेटा परत प्रतिबिंब (मेरा विचार नहीं) का उपयोग कर डोमेन ऑब्जेक्ट को तत्काल कैसे करता है।
नोट 3 संपादित करें: मुझे विश्वास नहीं है कि बैच ऑब्जेक्ट केवल एप्लिकेशन की किसी भी सूची को कुल करने में सक्षम होना चाहिए, ऐसा लगता है कि यह केवल उस विशेष बैच में मौजूद कुल एप्लिकेशन को सक्षम करने में सक्षम होना चाहिए। अन्यथा, यह सेवा कक्षा में समारोह छोड़ने के लिए मुझे और अधिक समझ में आता है।
पास्कल-आधारित स्थानीय चर। छी। – yfeldblum
@ जस्टिस, मुझे तुम्हारा दर्द महसूस होता है – mbillard