2009-06-30 10 views
5

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

//business class fragment 
public bool Save() 
{ 
    if(this.IsValid) 
    { 
     //DataProvider is one of many data access classes that implement an IDataProvider interface. Switched elsewhere in the class. This allows switching of Database providers, xml, etc. 
     DataProvider.Save(this); 
     return true; 
    } 
    return false; 
} 

public List<MyBusinessObject> GetObjectsByCriteria(string criteria) 
{ 
    return DataProvider.GetMyBusinessObjectsByCriteria(criteria); 
} 

मैं अपने व्यवसाय वर्गों के लिए है नहीं करना चाहती डेटासेट्स से निपटने के अलावा मुझे अपने डेटा लेयर क्लास बिजनेस क्लासेस के साथ सौदा करना पसंद है।

मैं एक बहुत पढ़ा पर डेटा एक्सेस ऑब्जेक्ट्स, या डाटा ट्रांसफर संभवतः इस समस्या को हल करने के लिए ऑब्जेक्ट्स, लेकिन यह उन पैटर्न के लिए एक विरोधी पैटर्न मामले की तरह लगता है है।

मैं क्या कर सकता हूं? मैं अपने आवेदन की इन दो परतों के पूर्ण अलगाव को कैसे प्राप्त करूं?

उत्तर

2

डेटा एक्सेस से डोमेन मॉडल को अलग करने के तरीके की तुलना में यह एक और सामान्य समस्या है। वही समस्या तब होती है जब आप अपने डोमेन लॉजिक से अपने एप्लिकेशन लॉजिक को अलग करने का प्रयास करते हैं, एप्लिकेशन प्रेजेंटेशन से आपका प्रेजेंटेशन मॉडल और आगे।

सामान्य समाधान निर्भरता इंजेक्शन (डीआई) नामक एक तकनीक है। कुछ लोग इसे नियंत्रण के नियंत्रण (आईओसी) के रूप में भी संदर्भित करते हैं।

इस विषय पर मौलिक पाठ मार्टिन फाउलर का आलेख Inversion of Control Containers and the Dependency Injection pattern था, लेकिन तब से हम एक लंबा सफर तय कर चुके हैं, इसलिए कुछ और हालिया ग्रंथों की जांच करना सुनिश्चित करें।

आप DI12 मैन्युअल रूप से लागू कर सकते हैं, जैसे described in this blog post, या आप डी कंटेनर (यानी।एक ढांचा) आपके लिए काम करते हैं।

आम डि कंटेनर हैं:

1

अपने व्यापार की वस्तुओं से बाहर हठ तर्क खींचो और उन्हें एक डाटा Adapter में डाल दिया। यह काम करेगा जैसे मौजूदा एडाप्टर .NET कार्य (OleDbDataAdapter) में। इस तरह आप अपनी व्यावसायिक वस्तुओं और दृढ़ता तर्क को भी अलग कर देंगे।

आपके ग्राहक का कोड थोड़ा और वर्बोज़ होगा, लेकिन मुझे लगता है कि वास्तव में सबसे अच्छा तरीका है सही मायने में परतों को अलग करने के लिए है।

+0

हम यही करते हैं, लेकिन हम इसे डीटीओ के साथ भी जोड़ते हैं। –

0

ऐसा करने के लिए एक लोकप्रिय पैटर्न रिपोजिटरी पैटर्न है। इस मामले में रिपोजिटरी संग्रह सेमेन्टिक्स का उपयोग करके एक मुखौटा के रूप में कार्य करता है, पूरी तरह छुपा रहता है जहां लगातार डेटा रहता है, चाहे वह फ़ाइल सिस्टम या डेटाबेस हो। आप इसे डेटा तक पहुंचने के लिए कार्यान्वित कर सकते हैं, फिर डेटा को मैप करें कि आप किस प्रकार के साथ काम करना चाहते हैं।

आप सक्रिय रूप से सक्रिय रिकॉर्ड पैटर्न के विकल्प के रूप में डोमेन संचालित डिज़ाइन को देख सकते हैं, जिसका उपयोग आप करते हैं।

0

आपको डीएओ पैटर्न (डेटा एक्सेस ऑब्जेक्ट) पर एक नज़र रखना चाहिए। http://en.wikipedia.org/wiki/Data_Access_Object

सबसे अच्छा है, एक तैयार डीएओ निर्माण (वसंत भरी हुई) का उपयोग करें। http://trac.synyx.org/hades

DAOs पर एक नज़र एक antipattern नहीं कर रहे हैं है! उन्हें वसंत और जेनरिक के साथ प्रयोग करें और आप देखभाल करने के लिए नहीं किया है;)

हर परतों के बीच एक संबंध नहीं है! उन्हें अलग करने के लिए पूरी तरह से मतलब है कि उनके पास संवाद करने की कोई उपलब्धता नहीं है (इसलिए वे बेकार हैं)।

बुनियादी सीआरयूडी संचालन या गतिशील खोजकर्ता whereever का उपयोग करें यह अर्थपूर्ण अर्थ बनाता है।

2

मुझे नहीं लगता कि आप दो पूरी तरह से अलग हो सकता है, लेकिन आप कर सकते हैं सुनिश्चित करें कि निर्भरता द्वि-दिशात्मक नहीं है।

मुझे लगता है कि यह चीजों के एक जोड़े को परिभाषित करने के लिए महत्वपूर्ण है: (आदि जैसे, व्यक्ति, पता, आदेश,)

  1. मॉडल वस्तुओं
  2. हठ परत (जैसे, DAOs, खजाने, आदि)
  3. सेवा परत (इंटरफेस जिनकी विधियों के मामलों का उपयोग करने के लिए मानचित्र, काम की इकाइयों के बारे में पता है, आदि)
  4. वेब या परत देखें (वेब ​​ऐप्स के लिए नियंत्रक/पृष्ठ, डेस्कटॉप के लिए विजेट)।

दृढ़ता, सेवा और परत परत मॉडल वस्तुओं के बारे में जानते हैं; मॉडल वस्तुओं परत वे शामिल हों अनजान हैं

परतों के लिए निर्भरता दिशाहीन कर रहे हैं और सामने करने के लिए वापस प्रवाह:।

  • persistence-> मॉडल
  • सेवा-> मॉडल, हठ
  • देखें> मॉडल, सेवा वापस करने के लिए सामने से

आप इकाई परीक्षण, क्योंकि निर्भरता आसान नकली है।

कोई निर्भरता नहीं है, लेकिन आपको उन्हें डिजाइन करना चाहिए ताकि कोई चक्र न हो।

के साथ एकमात्र वर्ग निर्भरता वह है जिसे किसी के द्वारा नहीं कहा जाता है और कभी भी किसी अन्य वर्ग को नहीं बुलाता है। यह न तो उपयोगी है और न ही एक सार्थक डिजाइन लक्ष्य है।

+0

मुझे नोस्रेना के प्रश्न पर "चिंताओं का अच्छा अलगाव" नहीं दिख रहा है। मुझे लगता है कि यह पोस्ट मिथक कुछ अवधारणाओं और मदद को स्पष्ट करता है। अच्छा पोस्ट, duffymo! –

0

एन-टियर desing: व्यापार तर्क परत में आप डेटा एक्सेस क्लास और डेटा मैनिपुलेशन क्लास बना सकते हैं। हमेशा एक इंटरफेस के लिए कार्यक्रम।

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

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