हमारे व्यावसायिक तर्क में हम कभी-कभी तरीकों को कुछ इस तरह परिभाषित करते हैं:
User.ResetCourse(Course courseToReset)
समस्या यह है कि उपयोगकर्ता और पाठ्यक्रम दोनों एंटिटी फ्रेमवर्क प्रॉक्सी ऑब्जेक्ट हैं। इसका मतलब यह है कि जब हम किसी उपयोगकर्ता या पाठ्यक्रम पर नेविगेशन गुणों को मारते हैं, तो यह डेटाबेस के लिए एक बड़ी हिट का कारण बन सकता है क्योंकि वे ऑब्जेक्ट IQueryable नहीं हैं, इसलिए यह उनके माध्यम से सामान्य रूप से पुनरावृत्त करता है।
इसे हल करने के लिए हमने हस्ताक्षर बदल दिए:
User.ResetCourse(MyDBContext db, Course courseToReset)
इसका मतलब है कि हम डेटाबेस को सीधे तौर पर उन बदलावों को बनाने के लिए क्वेरी कर सकते हैं जिनकी हमें कुशल तरीके से जरूरत है लेकिन डेटाबेस संदर्भ को किसी व्यावसायिक वस्तु तक पहुंचाना सिर्फ इतना गलत लगता है।
हमने बाद में एक सेवा परत के लिए उपयोगकर्ता को माइग्रेट किया जिसका अर्थ है कि हमारे पास कुछ है:
CourseService.ResetForUser(Course courseToReset, User forUser)
इस सेवा में निर्माण पर इंजेक्ट किए गए DBContext का संदर्भ है लेकिन अब हमारी व्यावसायिक वस्तुएं बिना किसी व्यवहार के डेटा बैग हैं (यानी एनीमिक डोमेन मॉडल)।
हम इससे कैसे बच सकते हैं?