7

में मॉडल और डेटा एक्सेस परतों के बीच LINQ का उपयोग करने के लिए एक सुझाव दिया गया है। मैं टिम मैककार्थी के awesome book on DDD in .NET पढ़ रहा हूं। हालांकि उनके उदाहरण के आवेदन में, उनकी अंतर्निहित डेटा एक्सेस एसक्यूएलसीई का उपयोग कर रही है और वह एसक्यूएल इनलाइन हैंड क्राफ्टिंग कर रहा है।क्या डीडीडी आधारित स्तरित आर्किटेक्चर

मैं एंटिटी फ्रेमवर्क का लाभ उठाने के लिए कुछ पैटर्न के साथ खेल रहा हूं लेकिन मुझे अंतर्निहित डेटा एक्सेस लेयर में आईआरपीओएसटीरी लिनक क्वेरी को मैप करने के तरीके पर अटक गया है।

मेरे पास एक ठोस भंडार कार्यान्वयन है।

public EFCustomerRepository : IRepository<DomainEntities.Customer> 
{ 
    IEnumerable<DomainEntities.Customer> GetAll(
        Expression<Func<DomainEntities.Customer, bool>> predicate) 
    { 
     //Code to access the EF Datacontext goes here... 
    } 
} 

मेरी एफई मॉडल में, मैं POCO संस्थाओं उपयोग कर रहा हूँ लेकिन फिर भी वहाँ मेरे DomainEntity.Customer & मेरी DataAccessLayer.Customer वस्तुओं के बीच कोई मूल मैपिंग होने के लिए जा रहा है।

तो मैं बस एक EFContext.Customers.Where(...);

के लिए पैरामीटर के रूप में Expression<Func<DomainEntities.Customer, bool>> predicate पारित नहीं हो सकता वहाँ एक आसान तरीका एक Expression<Func<T, bool>> predicate =>Expression<Func<TOTHER, bool>> predicate

या मैं इस बारे में जा रहा हूँ सब गलत मैप करने के लिए है? किसी भी सुझाव/पॉइंटर्स की सराहना की।

+2

क्या पुस्तक आपको डोमेन ऑब्जेक्ट्स * और * डेटा लेयर ऑब्जेक्ट्स का उपयोग करने का सुझाव देती है? यह अनावश्यक लगता है, खासकर जब आप पीओसीओ इकाइयों का उपयोग करते हैं। AFAIK डीडीडी के आस-पास के पूरे विचार को डोमेन की एक एकल परिभाषा है और इसे पूरे एप्लिकेशन में उपयोग करने की अनुमति है। – Steven

उत्तर

2

आपके उदाहरण में प्रदान किए गए कोड से मुझे लगता है कि आप एक सामान्य भंडार पैटर्न का उपयोग नहीं कर रहे हैं?

मैं एफई CodeFirst का उपयोग करें (लेकिन यह वर्ष एफई करने के लिए काम करता है) एक सामान्य भंडार पैटर्न के साथ ... http://average-uffe.blogspot.com/2011/03/repository-pattern-with-ef-code-first.html

मैं उस पोस्ट में Expression<Func<DomainEntities.Customer, bool>> की जरूरत नहीं है, लेकिन मैं हमेशा में एक ढूँढें metod है IRepository<T> इंटरफ़ेस।

इंटरफ़ेस:

IEnumerable<T> Find(Expression<Func<T, bool>> expression, int maxHits = 100); 

और अमूर्त baserepository में कार्यान्वयन:

public virtual IEnumerable<T> Find(Expression<Func<T, bool>> expression, int maxHits = 100) { 
    return this.DataContext.DbSet<T>().Where(expression).Take(maxHits); 
} 

और अब आप कॉल कर सकते हैं एक लैम्ब्डा अभिव्यक्ति द्वारा किसी भी संस्था पर खोजें ...

मैं यदि आप इसे सही नहीं पाते हैं तो एक पूर्ण उदाहरण पोस्ट कर सकते हैं, बस कब कहें।

3

इस तरह के मामले में आपको एक अभिव्यक्ति वृक्ष के अपने स्वयं के कस्टम कनवर्टर को दूसरे (शायद अधिक एक) में लागू करना होगा जो आपके मैपिंग तर्क को पूरी तरह से शामिल करेगा। आम तौर पर आपकी अभिव्यक्ति केवल विनिर्देश (विनिर्देश पैटर्न) पर होती है और आपको अभिव्यक्ति को संग्रहीत करने के लिए उस विनिर्देश को बदलना होगा।

बीटीडब्ल्यू। यह गलत है। अलग-अलग डेटा एक्सेस लेयर ऑब्जेक्ट्स नहीं होनी चाहिए - डेटा एक्सेस लेयर को सीधे अपने डोमेन ऑब्जेक्ट्स को लोड और सहेजना चाहिए, लेकिन ईएफ इसे सही तरीके से करने में पूरी तरह से सक्षम नहीं है क्योंकि इसकी मैपिंग कार्यक्षमता सीमित है और यह इकाइयों को अपनी आवश्यकताओं को धक्का देती है। यदि आप डीडीडी को गंभीरता से (पुस्तक द्वारा) करना चाहते हैं तो आपको NHibernate या अन्य ORM जांचना चाहिए।

+0

धन्यवाद, महान इनपुट!लेकिन मैं अभी भी सोच रहा हूं कि एक्स्ट्रेसशन का उपयोग करके एएसटी कनवर्टन कैसे लिखना है? क्या आप पढ़ने के लिए कुछ अच्छा उदाहरण, ओपन सोर्स प्रोजेक्ट या किताबें प्रदान कर सकते हैं? मुझे वास्तव में इसे जल्दी से लागू करने की आवश्यकता है :) – ajukraine