2009-09-20 22 views
5

मैं ट्यूटोरियल्स (विशेष रूप से लिंक-टू-एंटिटीज का उपयोग करने वाले) के माध्यम से जा रहा हूं और मैं बुनियादी अवधारणाओं को समझता हूं, हालांकि कुछ चीजें मुझे समस्याएं दे रही हैं।क्या मेरा एएसपी.नेट एमवीसी एप्लीकेशन ठीक से संरचित है?

ट्यूटोरियल में आमतौर पर केवल साधारण मॉडल और रूप शामिल होते हैं जो केवल मूल निर्माण, अद्यतन और बयान हटाते हैं। मेरा थोड़ा और जटिल है, और मुझे यकीन नहीं है कि मैं इस बारे में सही तरीके से जा रहा हूं क्योंकि जब आधा दर्जन डेटाबेस ऑब्जेक्ट्स के रिश्ते को संभालने का समय आता है, तो ट्यूटोरियल मदद करना बंद कर देते हैं।

पोस्ट विधि के लिए, CRUD संचालन

entities.AddToTableSet(myClass); 
entities.SaveChanges(); 

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

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Add(int id, [Bind(Exclude = "Id")] ClassA classA, 
         [Bind(Exclude = "Id")]ClassB classB) 
{ 
    // Validation occurs here 

    if(!ModelState.IsValid) 
     return View(); 

    try 
    { 
     _someRepositoryOrService.Add(id, classA, classB); 
     return RedirectToAction("Index", new { id = id }); 
    } 
    catch(Exception ex) 
    { 
     // Logging and exception handling occurs here 
    } 
} 


public void Add(int id, ClassA classA, ClassB classB) 
{ 
    EntityA eA = new EntityA 
    { 
     // Set a bunch of properties using the two classes and 
     // whatever queries are needed 
    }; 

    EntityB eB = new EntityB 
    { 
     // Set a bunch of properties using the two classes and 
     // whatever queries are needed 
    }; 

    _entity.AddToEntityASet(eA); 
    _entity.AddToEntityBSet(eB); 
    _entity.SaveChanges(); 
} 

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

संपादित करें: मैं भी इस दृष्टिकोण के बारे में चिंतित हूँ क्योंकि यह खाली कंस्ट्रक्टर्स ठीक से यह त्रुटि संदेश के कारण LINQ प्रश्नों करने के लिए की आवश्यकता है:

केवल parameterless निर्माणकर्ता और initializers LINQ में समर्थित हैं संस्थाओं ।

यह एक बड़ा सौदा नहीं है क्योंकि मुझे शायद ही कभी रचनाकारों के तर्क की आवश्यकता है, लेकिन क्या यह कोई रचनाकार और केवल सार्वजनिक गुण नहीं है?

+1

लिंक से इकाइयों द्वारा उपयोग किए गए ऑब्जेक्ट कॉन्टेक्स्ट डेटा मैपिंग से ऑब्जेक्ट्स बनाने के लिए प्रतिबिंब का उपयोग करता है, इसलिए यह महत्वपूर्ण है और आवश्यक है कि सभी इकाइयों में पैरामीटर रहित कन्स्ट्रक्टर हो ताकि इसे आपके प्रकार को क्रमबद्ध करने में सक्षम होना चाहिए। एक सार्वजनिक कन्स्ट्रक्टर की भी आवश्यकता होगी – dmportella

उत्तर

4

_someRepositoryOrService.Add (id, classA, classB);

मैं कहूंगा कि आप प्रस्तुति परत के साथ अपने भंडार जोड़े हैं। यह नहीं होना चाहिए। आपके भंडार केवल इकाइयों के साथ काम करना चाहिए।इसके बाद, ध्यान दें कि किस अपने ऐड विधि

सार्वजनिक शून्य जोड़ें (पूर्णांक आईडी, ClassA ClassA, ClassB classB) चिंताएं (SoC) की

टूटता पृथक्करण। भंडार

जाहिर है पहला कदम प्रस्तुति परत में किया जाना चाहिए करने के लिए बचाने संस्थाओं

  • में

    1. मानचित्र दृश्य डेटा: यह दो कार्य करता है। इसके लिए मॉडल बाइंडर्स का उपयोग करने पर विचार करें। यह आपको रचनाकारों की समस्या को हल करने में भी मदद कर सकता है, क्योंकि आपके मॉडल बाइंडरों को निर्माण आवश्यकताओं के बारे में जानकारी दी जा सकती है।

      जिमी बोगर्ड (एएसपी.नेट एमवीसी इन एक्शन के सह-लेखक) द्वारा ViewModels के बारे में यह उत्कृष्ट post भी देखें। यह आपको मैपिंग स्वचालित करने में मदद कर सकता है। यह एक उलटा तकनीक का भी सुझाव देता है - अपने नियंत्रकों को इकाइयों के साथ काम करें, न कि ViewModels! कस्टम एक्शन फ़िल्टर और मॉडल बाइंडर्स वास्तव में दिनचर्या को खत्म करने की कुंजी हैं जो वास्तव में नियंत्रकों से संबंधित नहीं बल्कि दृश्य और नियंत्रक के बीच एक बुनियादी ढांचे का विवरण है। उदाहरण के लिए, here मैं कैसे संस्थाओं के आगमन को स्वचालित करता हूं। Here मैं कैसे देखता हूं कि नियंत्रकों को क्या करना चाहिए।

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

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

      पहला कदम भंडार में किया जाना चाहिए, यह सही है - सिवाय इसके कि क्लासएक्स से EntityX तक मैपिंग उस चरण से संबंधित नहीं है। यह मैपिंग चिंता - एक बुनियादी ढांचा है। उदाहरण के लिए this मानचित्रण के बारे में प्रश्न देखें, लेकिन आम तौर पर यदि आपके पास दो परतें (UI और रिपॉजिटरीज़) हैं तो उन्हें मानचित्रण के बारे में परवाह नहीं करना चाहिए - एक मैपर सेवा/सहायक होना चाहिए। जिमी के ब्लॉग के अलावा, आप एएसपी.नेट एमवीसी इन एक्शन भी पढ़ सकते हैं या कंट्रोलर कन्स्ट्रक्टर को पास किए गए आईईएनटीटीमैपर इंटरफेस के साथ मैपिंग करने के लिए अपने CodeCampServer को देख सकते हैं (ध्यान दें कि यह जिमी बोगर्ड के ऑटोमैपर का अधिक मैनुअल और कम-काम दृष्टिकोण है)।

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

  • +0

    रिपॉजिटरीज को युग्मित करने के लिए, मुझे यकीन नहीं है कि आपका क्या मतलब है, नियंत्रक में एक भंडार होने के कारण ऐसा लगता है कि अधिकांश ट्यूटोरियल भी करते हैं। प्रस्तुति परत में पहले चरण के लिए किया जाना चाहिए, इसे भंडार में नहीं किया जाना चाहिए? मैंने सोचा कि भंडार का उद्देश्य डेटाबेस डेटा में फॉर्म डेटा को संभालने के बारे में चिंता करना था? – Brandon

    +0

    उदाहरण और सलाह के लिए भी धन्यवाद। मेरे पास वास्तव में बदलाव करने का समय नहीं है, लेकिन यह सही दिशा में एक अच्छा झुकाव है। – Brandon

    +0

    अपडेट देखें। मैं धीरे-धीरे रिफैक्टर करने का सुझाव दूंगा, उदाहरण के लिए पहले _realEntityRepository.Add (EntityMapper.From (classA)); (या classA.MapToEntity()), फिर कस्टम मॉडलबिन्डर (जो एक बड़ा विषय है) शामिल है, फिर आईओसी कंटेनर (एक और बड़ा विषय) जोड़ें, और इसी तरह। – queen3

    4

    मैं डीटीओ का उपयोग करके और एंटिटी फ्रेमवर्क को अपने डेटा एक्सेस विधियों और व्यावसायिक परत के साथ लपेटने का कहना चाहूंगा। आप बहुत सारे कोड लिखना समाप्त कर सकते हैं, लेकिन यह एंटिटी फ्रेमवर्क जेनरेट कोड का नाटक करने की तुलना में एक बेहतर आर्किटेक्चर है जो आपकी व्यावसायिक परत है।

    ये मुद्दे वास्तव में एएसपी.नेट एमवीसी से किसी भी तरह से बंधे नहीं हैं। एएसपी.नेट एमवीसी मूल रूप से आपके मॉडल/डेटा एक्सेस को कैसे करें और एएसपी.नेट एमवीसी के लिए नमूने और ट्यूटोरियल के अधिकांश पर कोई मार्गदर्शन नहीं देता है, यह उत्पादन योग्य मॉडल कार्यान्वयन नहीं है, बल्कि वास्तव में केवल न्यूनतम नमूने हैं।

    ऐसा लगता है जैसे आप सही रास्ते पर हैं, चलते रहें।

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

    +0

    मैं वास्तव में केवल कुछ नया प्रयास करने के लिए इकाई फ्रेमवर्क का उपयोग कर रहा हूं। मैं nHibernate का उपयोग करने के लिए उपयोग कर रहा हूँ। क्या आपके पास बेहतर जनरेटर या ढांचे के लिए कोई सुझाव है जिसका उपयोग करना चाहिए? – Brandon

    +0

    मुझे कुछ भी पता नहीं है जो आपकी आवश्यकताओं के लिए उपयुक्त है। इनमें से कुछ वाणिज्यिक हैं और कुछ मुफ्त हैं। किसी विशेष क्रम में: टी 4 टेम्पलेट्स, कोडस्मिथ, एलएलबीएलजेन प्रो। –

    +1

    यह ज्यादातर एक बहुत अच्छा जवाब है (+1), लेकिन मैं असहमत हूं कि वह कोड जनरेटर के रूप में इकाई फ्रेमवर्क का उपयोग कर रहा है। और भी महत्वपूर्ण बात यह है कि वह ऑब्जेक्ट स्पेस में अपने डेटाबेस को मैप करने के लिए एंटिटी फ्रेमवर्क का उपयोग कर रहा है। यह महत्वपूर्ण है भले ही आप वास्तव में किसी इकाई प्रकार को भौतिक रूप से पूरा न करें; आप अभी भी अपने LINQ में इकाइयों की क्वेरी में मैपिंग इकाइयों का उपयोग करते हैं क्योंकि आप उन्हें अन्य प्रकारों पर प्रोजेक्ट करते हैं। –