2010-09-09 21 views
6

से कैसे निपटते हैं ID4 (एएसपी एमवीसी 2 संदर्भ में) के साथ डीडीडी लागू करने की कोशिश कर रहे कई समस्याओं का सामना कर रहे हैं। आपकी सलाह बहुत सराहना की जाएगी।आप डीडीडी और ईएफ 4

सबसे पहले, मैंने पीओसीओ का उपयोग शुरू किया क्योंकि ऑब्जेक्ट कॉन्टेक्स्ट पर निर्भरता कई स्थितियों में बहुत सहज नहीं थी।

पीओसीओ पर जाकर कुछ समस्याएं हल हुईं लेकिन अनुभव वह नहीं है जिसका उपयोग मैंने एनएचबेर्नेट के साथ किया था।

मैं जानना चाहता हूं कि डिजाइनर का उपयोग करना संभव है और न केवल संस्थाएं उत्पन्न करने के लिए बल्कि एक मूल्य वस्तुएं (कॉम्प्लेक्स टाइप?) भी उत्पन्न करना संभव है। अगर मेरा मतलब है कि वैल्यू ऑब्जेक्ट एक वर्ग है जिसमें किसी भी सेट गुण के बिना एक सीटीआर है (टी 4 संशोधन की आवश्यकता है?)।

एनीमिक इकाइयों के व्यवहार को जोड़ने का एकमात्र तरीका आंशिक कक्षाएं बनाना है जो edmx द्वारा उत्पन्न किए गए हैं। मैं इस दृष्टिकोण से संतुष्ट नहीं हूं।

मुझे नहीं पता कि एक एडीएमएक्स के साथ कई रिपॉजिटरीज़ कैसे बनाएं। अभी के लिए मैं प्रत्येक कुल के लिए समूह विधियों के लिए आंशिक कक्षाओं का उपयोग कर रहा हूँ। प्रत्येक समूह वास्तव में एक भंडार है।

अंतिम प्रश्न IQueryable के बारे में है। क्या इसे भंडार के बाहर उजागर किया जाना चाहिए? यदि मैं ब्ली बुक का संदर्भ देता हूं, तो भंडार निष्पादन की इकाई होना चाहिए और IQueryable जैसे कुछ का खुलासा नहीं करना चाहिए। तुम क्या सोचते हो ?

आपकी मदद के लिए धन्यवाद।

थॉमस

+1

IQueryable प्रश्न के संबंध में, इसे देखें: http://stackoverflow.com/questions/1699607/asp-mvc-repository-that-reflects-iqueryable-but-not-linq-to-sql-ddd-how-to -ques/16 99756 # 16 99756 –

उत्तर

0

कुछ समय हो गया जब मुझे लगता है कि प्रश्न पूछा और अपने दम पर यह करने के लिए एक मौका था।

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

मैं अपने खजाने से IEnumerable बेनकाब और विश्वास मुझे, यह मेरे कई मुसीबतों बचाता है।

4

यह Pocos उपयोग करने के लिए, लेकिन ध्यान दें कि EntityObject एक ObjectContext की आवश्यकता नहीं है ठीक है।

हां, जटिल प्रकार मूल्य वस्तुएं हैं और हां, आप उन्हें डिजाइनर में उत्पन्न कर सकते हैं। किसी इकाई के कई गुणों का चयन करें, राइट क्लिक करें, और जटिल प्रकार में रिफैक्टर चुनें।

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

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

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। जनरल मैंने इकाइयों को स्पष्ट व्यवहारिक तरीकों को रखा। जब यह स्पष्ट नहीं होता है तो मैं इसके लिए एक सेवा बनाता हूं। आप उस बिंदु को कैसे हल करते हैं? यदि रिपॉजिटरीज IQueryable का पर्दाफाश करते हैं तो इस बात की कोई गारंटी नहीं है कि इसे किसी भी समय निपटाया जाएगा या यदि इसका निपटारा किया गया है तो सूची में या अक्षरों को परिवर्तित करने के दौरान समस्या होगी क्योंकि कनेक्शन पहले ही बंद हो जाएगा। –

+0

कनेक्शन निपटाने के संबंध में, मेरी डोमेन सेवाओं का सार्वजनिक चेहरा कार्य वस्तु की एक इकाई है। काम की इकाई IDISposable लागू करता है। काम की इकाई ऑब्जेक्ट कॉन्टेक्स्ट उदाहरण के लिए एक निजी संदर्भ रखती है जो कि कन्स्ट्रक्टर इंजेक्शन के माध्यम से भंडारों को पास की जाती है। मेरे मामले में, काम की इकाई एएसपी.नेट एमवीसी नियंत्रकों द्वारा खपत की जाती है, जो खुद को तब तक डिस्पोजेड नहीं किया जाता जब तक विचार प्रस्तुत नहीं किए जाते हैं, इसलिए सही समय पर सब कुछ निपटाना काफी स्वाभाविक है; मुझे इसके बारे में कभी सोचना नहीं है। –

+0

व्यापार विधियों को कहां रखा जाए, मुझे डोमेन सेवाओं और कुछ अन्य स्थानों पर दूसरों की बजाय डोमेन सेवाओं में सब कुछ डालने के लिए और अधिक प्राकृतिक लगता है। यह विशेष रूप से महत्वपूर्ण है जब आप ADO.NET डेटा सेवाओं/एस्टोरिया जैसी डेटा सेवाओं का उपयोग करते हैं। –

1

मुझे लगता है कि भंडार के बाहर IQueryable का खुलासा करना ठीक है, केवल इसलिए कि ऐसा नहीं करना अनावश्यक रूप से प्रतिबंधित हो सकता है। यदि आप केवल GetPeopleByBirthday और GetPeopleByLastName जैसी विधियों के माध्यम से डेटा का पर्दाफाश करते हैं, तो क्या होता है जब कोई व्यक्ति अंतिम नाम और जन्मदिन से किसी व्यक्ति की खोज करता है? क्या आप अंतिम नाम "स्मिथ" के साथ सभी लोगों को खींचते हैं और अपने जन्मदिन के लिए एक रैखिक खोज करते हैं, या आप GetPeopleByBirthdayAndLastName पर एक नई विधि बनाते हैं? गरीब बेकार साथी के बारे में क्या है जिसे क्यूबीई फॉर्म लागू करना है?

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

बेशक

, आप चिंतित हैं कि यदि कोई उपयोगकर्ता दूसरे का डेटा देखने के लिए सक्षम हो सकता है हो सकता है, लेकिन यह कम करने के लिए है क्योंकि आप कौन-सा डेटा बाहर देने के सीमित कर सकते हैं आसान है। उदाहरण के लिए:

public IQueryable<Content> Content 
{ 
    get { return Content.Where(c => c.UserId == this.UserId); } 
} 

यह सुनिश्चित करें कि केवल Content पंक्तियों को उपयोगकर्ता प्राप्त कर सकते हैं उन है कि उसकी UserId है कर देगा।

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

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