एंटिटी फ्रेमवर्क और एनीमिक डोमेन मॉडल से परहेज


11

हमारे व्यावसायिक तर्क में हम कभी-कभी तरीकों को कुछ इस तरह परिभाषित करते हैं:

User.ResetCourse(Course courseToReset)

समस्या यह है कि उपयोगकर्ता और पाठ्यक्रम दोनों एंटिटी फ्रेमवर्क प्रॉक्सी ऑब्जेक्ट हैं। इसका मतलब यह है कि जब हम किसी उपयोगकर्ता या पाठ्यक्रम पर नेविगेशन गुणों को मारते हैं, तो यह डेटाबेस के लिए एक बड़ी हिट का कारण बन सकता है क्योंकि वे ऑब्जेक्ट IQueryable नहीं हैं, इसलिए यह उनके माध्यम से सामान्य रूप से पुनरावृत्त करता है।

इसे हल करने के लिए हमने हस्ताक्षर बदल दिए:

User.ResetCourse(MyDBContext db, Course courseToReset)

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

हमने बाद में एक सेवा परत के लिए उपयोगकर्ता को माइग्रेट किया जिसका अर्थ है कि हमारे पास कुछ है:

CourseService.ResetForUser(Course courseToReset, User forUser)

इस सेवा में निर्माण पर इंजेक्ट किए गए DBContext का संदर्भ है लेकिन अब हमारी व्यावसायिक वस्तुएं बिना किसी व्यवहार के डेटा बैग हैं (यानी एनीमिक डोमेन मॉडल)।

हम इससे कैसे बच सकते हैं?


11
लगता है जैसे आप बस एहसास है कि इकाई ढांचे मॉडल वास्तव में डीटीओ हैं, और वास्तव में एक डोमेन मॉडल बिल्कुल नहीं मारा है। क्या आप वास्तव में DDD करने की कोशिश कर रहे हैं? यदि नहीं, तो यह शायद कोई फर्क नहीं पड़ता।
१३:३६ पर श्री कोचेश

3
एडीएम प्लस सेवाएं बहुत सारी चीजों के लिए एक अच्छा आर्किटेक्चर है
इवान


2
@JohnWu एक बहुत ही पक्षपाती लेख है। वास्तव में इसमें अमीर उदाहरण में सक्रिय रिकॉर्ड पैटर्न को शामिल करके एक समृद्ध डोमेन मॉडल का "स्ट्रॉमन" संस्करण है। निश्चित रूप से, सक्रिय रिकॉर्ड डीडीडी में जासूसी नहीं है और सामान्य तौर पर किसी भी जटिल अनुप्रयोग के लिए एक खराब विकल्प है।
रिबेल्डिदेई

जवाबों:


8

समस्या यह है, आप पहली बार में डोमेन ऑब्जेक्ट के रूप में EF ऑब्जेक्ट का उपयोग कर रहे हैं। EF ऑब्जेक्ट डेटा मॉडल हैं व्यावसायिक मॉडल नहीं हैं।

आपको उन व्यावसायिक वस्तुओं को घोषित करने की आवश्यकता है जो आपको आवश्यकतानुसार स्वतंत्रता देते हैं, और फिर उन्हें भंडार के साथ पुनर्प्राप्त और संग्रहीत करते हैं। आपकी रिपॉजिटरी EF संस्थाओं को आपके व्यावसायिक संस्थाओं को मैप करेगी। EF ऑब्जेक्ट्स को आपके रिपॉजिटरी के बाहर कभी भी उपयोग नहीं किया जाना चाहिए।


0

आप शायद कुछ ऐसा करके इससे बच सकते हैं:

CourseService.prepareForUserCourseReset(DBContext db);
User.reset();
Course.reset();
CourseService.completeUserCourseReset(DBContext db);

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


-1

परंपरागत रूप से, यह प्रत्येक उपयोग के मामले के लिए एक फ़िशिंग रणनीति का उपयोग करके हल किया जाता है, जो एंटिटी फ्रेमवर्क को IQueryable.Include () का उपयोग करके प्रारंभिक क्वेरी पर आवश्यक संघों को लोड करने के लिए प्रेरित करता है।

उदी दहन ने एक पोस्ट लिखी जो सामान्य दृष्टिकोण का वर्णन करती है, जिसे एंटिटी फ्रेमवर्क के लिए अनुकूलित किया जा सकता है।

http://udidahan.com/2007/09/16/fetching-strategy-nhibernate-implementation-available/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.