2012-01-05 13 views
8

मैं एएसपी.नेट वेब फॉर्म सी # का उपयोग करके स्क्रैच से समाधान बना रहा हूं।.NET एन-टियर आर्किटेक्चर: मॉडल ऑब्जेक्ट्स के बारे में मैं क्या करूँ?

मैं मॉडल ऑब्जेक्ट्स के बारे में चिंतित हूं क्योंकि मैं प्रत्येक परत में मॉडल ऑब्जेक्ट्स के डुप्लिकेट सेट नहीं बनाना चाहता हूं। Web Forms में 3 परत आर्किटेक्चर में मॉडल ऑब्जेक्ट्स का उपयोग करने के लिए सबसे अच्छा अभ्यास क्या है?

संरचना मैं मन में है इस प्रकार है:

  • यूआई
  • BLL
  • दाल
  • मॉडल

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

  1. यूआई डेटा से भरे मॉडल ऑब्जेक्ट में बीएलएल में गुजरने वाली विधि को कॉल करता है।
  2. BLL दाल में एक विधि वस्तु जो डेटाबेस में सहेजा जाता है के माध्यम से गुजर आदि

धन्यवाद

+1

मेरे जवाब पर फंकी देखो: http://stackoverflow.com/a/7474357/559144 यह सामान्य तरीका है जो मैं चीजें करता हूं और अच्छी तरह से काम करता हूं, न केवल एमवीसी और इकाई फ्रेमवर्क के लिए ... वास्तव में एमवीसी मॉडल मॉडल में डी एक इकाई प्रकार है जिसमें केवल निम्न परतों में परिभाषित वास्तविक व्यापार इकाइयों द्वारा निहित कुछ फ़ील्ड हैं, यह निर्भर करता है कि यदि आपको वास्तव में यूआई स्तर के सभी क्षेत्रों की आवश्यकता है या केवल कुछ डेटा प्रतिपादन और इनपुट करने के लिए कुछ है। –

+5

एफवाईआई, "स्तरीय" और "परत" बराबर शर्तों नहीं हैं। आपके द्वारा वर्णित अनुसार लॉयर लॉजिकल अलगाव को संदर्भित करता है। टियर आमतौर पर भौतिक हार्डवेयर अलगाव (यानी डेटाबेस सर्वर, वेब सर्वर) को संदर्भित करता है। – MattDavey

+0

@ मैटडेवी: आह मैं देखता हूं, धन्यवाद! – Funky

उत्तर

1

देखो: https://stackoverflow.com/a/7474357/559144 इस हमेशा की तरह मैं बातें करते है और MVC में केवल MVC और इकाई की रूपरेखा के लिए नहीं, अच्छी तरह से काम करता है ... वास्तव में मॉडल एक हो सकता है इकाई प्रकार जिसमें केवल निम्न परतों में परिभाषित वास्तविक व्यापार इकाइयों द्वारा निहित कुछ फ़ील्ड हैं, यह निर्भर करता है कि आपको वास्तव में यूआई स्तर के सभी क्षेत्रों की आवश्यकता है या केवल कुछ डेटा प्रतिपादन और इनपुट करने के लिए ...

+1

महान जवाब! बहुत सरल और स्पष्ट कटौती! मैंने इसे अपने समाधान में कार्यान्वित किया है और यह अच्छी तरह से काम कर रहा है कि एमवीवीएम के मामले में एमवीवीएम के मामले में मॉडल ऑब्जेक्ट्स – Funky

+0

@ डेविड को डुप्लिकेट करने के विरोध में भविष्य में जोड़ने के लिए सबकुछ आसानी से जोड़ना आसान हो गया है, इनोटिफाइड से कैसे निपटें .. .in मॉडल –

8

मॉडल अपने परतों के साथ एक cross-cutting concern है, जो एक त्वरित तरीका है यह करने के लिए है हो सकता है कॉल । या आप अपने मॉडल के लिए इंटरफेस बना सकते हैं जैसे कि आप आसानी से बीएलएल की तरह कुछ इंटरफेस निकाल सकते हैं - यह कम से कम इसे क्रॉस-काटने से रोकता है।

यह आगे निर्भर करता है कि आपके मॉडल सरल डेटा कंटेनर हैं (anemic domain model), या व्यवहार शामिल हैं, जैसे स्वयं को सत्यापित करने की क्षमता या स्वयं को ट्रैक करने की क्षमता (rich domain model)।

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

5

अपेक्षाकृत छोटे एप्लिकेशन में, आप अपने Domain Entities को अपने Presentation layer तक सभी तरह से साझा कर सकते हैं लेकिन इस परिचय के युग्मन से अवगत रहें।

में यदि आपका आप प्रकार Customer के एक इकाई को छोड़कर एक संपत्ति Address के साथ एक StreetLine1 और StreetLine2 संपत्ति तो आपके सभी परतों कसकर एक साथ मिलकर कर रहे हैं के साथ डेटा बाइंडिंग और एक परत में एक परिवर्तन शायद अन्य परतों में परिवर्तन का कारण होगा।

तो आपका निर्णय आपके प्रोजेक्ट के पैमाने और युग्मन की मात्रा के आधार पर होना चाहिए।

यदि आप कम युग्मित डिज़ाइन के लिए जाते हैं तो आपके BLL इकाइयों को पुनर्प्राप्त करने के लिए अपने DAL का उपयोग करेंगे और व्यवहार को निष्पादित करने के लिए उन इकाइयों का उपयोग करेंगे। BLL आपके Presentation layer पर जाने के लिए Data Transfer Objects का उपयोग करेगा, इसलिए आपके presentation layer और आपके Domain Model के बीच कोई युग्मन नहीं है।

+0

अतिरिक्त डीकॉप्लिंग के लिए, आप बीएलएल और यूआई के बीच एक सेवा/एप्लिकेशन लेयर (http://martinfowler.com/eaaCatalog/serviceLayer.html) जोड़ सकते हैं। – MattDavey

+1

एक सेवा परत लाभकारी हो सकती है, उदाहरण के लिए यदि आप डब्ल्यूसीएफ या कुछ का उपयोग कर रहे हैं, लेकिन आपको यह देखना होगा कि आपके डोमेन मॉडल में जो तर्क होना चाहिए, वह आपकी सेवा परत में रिसाव नहीं करता है और आप एक के साथ समाप्त होते हैं एनीमिक डोमेन मॉडल: http: //martinfowler.com/bliki/AnemicDomainModel.html (मुझे यह मानना ​​है कि यह मेरे साथ कुछ बार हुआ) –

+0

+1 सहमत - सेवा परत ** समन्वय ** अनुक्रम को छोड़कर कुछ भी नहीं करना चाहिए डोमेन मॉडल में तर्क का। – MattDavey

0

संबंधित विषय के रूप में, कृपया यह related answer देखें जो मैंने हाल ही में कोड के दोहराव से बचने और क्रॉस-प्लेटफ़ॉर्म क्लाइंट/सर्वर सिस्टम में सही आर्किटेक्चर से बचने के लिए पोस्ट किया था।

मैंने इस धागे में अन्य पोस्टर को +1 किया है क्योंकि यह पूर्ण उत्तर नहीं है, केवल प्रश्न से संबंधित उपयोगी जानकारी है।

सादर, यहाँ मेरा उत्तर में