2008-09-09 10 views
11

के साथ चिंताओं को अलग करना मैंने हाल ही में एक नया वेबफॉर्म प्रोजेक्ट शुरू किया और किसी भी डीबीएमएल संदर्भ से बिजनेस क्लास को अलग करने का फैसला किया। मेरी व्यावसायिक परत कक्षाएं इसके बजाय अलग-अलग डेटा परत विधियों तक पहुंचती हैं और डीटीओ के संग्रह वापस लौटा दी जाती हैं। तो डेटा परत डीटीओ के परियोजना हो सकता है जैसे निम्नलिखित:लिंक टू एसक्यूएल और डीटीओ के

(from c in dataContext.Customers 
where c.Active == true 
select new DTO.Customer 
{ 
    CustomerID = c.CustomerID, 
    Name = c.CustomerName, 
    ... 
}).ToList() 

हालांकि डीटीओ वस्तुओं के निर्माण के काम कहते हैं, यह एक तंग बाध्यकारी व्यापार & के बीच डाटा परतों के लिए एक बेहतर दृष्टिकोण की तरह लगता है और मैं बिना व्यापार परत परीक्षण कर सकते हैं इसका मतलब है एक डेटाबेस मौजूद है।

मेरा सवाल है, क्या यह अच्छा अभ्यास है ?, क्या डीटीओ (शायद एसक्यूएलमैटल के माध्यम से) उत्पन्न करने का कोई तरीका है, और परियोजना की प्रगति के रूप में मैं अन्य समस्याओं को कैसे रोक सकता हूं।

+0

मैंने यहां बाहरी एक्सएमएल मैपिंग के बारे में कुछ लिंक पोस्ट किए हैं: http://stackoverflow.com/questions/988872/linq-to-sql-external-mapping/1136039#1136039 – alexandrul

उत्तर

5

मुझे नहीं पता कि यह सबसे अच्छा अभ्यास है या नहीं, लेकिन मैंने हाल ही में अतीत में इसी तरह का कोड लिखा है क्योंकि मुझे भी लगा कि मैं LINQ-designer-जेनरेट की बजाय अपनी कक्षाओं का उपयोग करके चिंताओं को अलग करने में सुधार कर सकता हूं मेरे आवेदन के भीतर।

तुम बस अपने डेटा-अभिगम विधि से बजाय एक IQueryable < ग्राहक > लौटने एक IList < ग्राहक > का विचार कर सकते हैं। चूंकि IQueryable < टी > आईनेमेरेबल < टी > से विरासत विरासत में से बाकी का ऐप इसके साथ सौदा करने में सक्षम होना चाहिए। जब आपको वास्तव में आवश्यकता होती है तो आप उसे एक सूची में भी परिवर्तित कर सकते हैं।

इसका लाभ यह है कि आप अपनी क्वेरी को गतिशील रूप से संशोधित कर सकते हैं और SQL सर्वर से लौटाए गए डेटा की मात्रा को कम कर सकते हैं।

उदा। यदि आपकी विधि हस्ताक्षर IQueryable < ग्राहक > GetCustomers() आप GetCustomers() को कॉल करके एक ग्राहक प्राप्त कर सकते हैं। जहां (c => c.CustomerID == 101) .Single();

इस उदाहरण में डेटाबेस से केवल एक रिकॉर्ड वापस किया जाएगा, जबकि मुझे लगता है कि वर्तमान में आपका कोड सभी ग्राहकों को वापस कर देगा या आपको अलग-अलग तरीकों (और इस प्रकार दोहराव कोड) लिखने की आवश्यकता होगी ताकि सभी अलग-अलग चीजें जिन्हें आप फ़िल्टर करना चाहते हैं।

+4

मैं बिल्कुल विपरीत विपरीत अनुशंसा करता हूं। मैं कभी भी डीएएल के बाहर एक आईएलआईस्ट पर एक IQuerable वापस नहीं आऊंगा। यदि आप करते हैं, तो आपकी प्रस्तुति परत अनजाने में डेटाबेस क्वेरी निष्पादित करने की संभावना समाप्त हो जाएगी, या आप लिंक-टू-ऑब्जेक्ट कॉल को मिश्रित कर सकते हैं और एक लिंक-टू-एसक्यूएल त्रुटि प्राप्त कर सकते हैं। लिंक-टू-एसक्यूएल से लौटने योग्य IQuerable वास्तव में खराब और रिसाव आर्किटेक्चर बनाता है और सभी के लिए डूबने वाले खिलौनों के अनुप्रयोगों से बचा जाना चाहिए। – mattmc3

2

ज्यादातर मामलों में मेरी राय में LINQ से निपटने के दौरान डीटीओ वस्तुओं की आवश्यकता नहीं है। जेनरेटेड LINQ कक्षाओं का आसानी से परीक्षण किया जा सकता है। LINQ आपको समान प्रश्नों का उपयोग करके विभिन्न स्रोतों से अपने डेटा से पूछताछ करने की क्षमता देता है। यह आपको वास्तविक डीबी की बजाय वस्तुओं की सूचियों के खिलाफ अपने प्रश्नों का परीक्षण करने की क्षमता देता है।

+0

सहमत हुए। संक्षेप में, आपके लिंक-टू-एसक्यूएल ऑब्जेक्ट्स को डीटीओ के रूप में माना जा सकता है, और आपके एल 2 एस ऑब्जेक्ट्स को धारावाहिक के रूप में उत्पन्न करने के लिए एक टी 4 टेम्पलेट भी है। – mattmc3

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