2012-02-07 9 views
23

मुझे अपनी कंपनी में हमारे कोड बेस के लिए एक नई वास्तुकला की नींव बनाने शुरू करने के लिए आगे बढ़ना पड़ा है। इस पहल के लिए प्रोत्साहन तथ्य यह है कि:एक सख्त स्तरित वास्तुकला में अलग परतों को तोड़ने और अनावश्यक अनावश्यकता के बिना मॉड्यूलरिटी को बढ़ावा देने के लिए कैसे?

  • हमारा कोड बेस दस साल से अधिक पुराना है और अंत में हम पैमाने पर तोड़ने की कोशिश करते हैं।
  • शीर्ष "परतें", यदि आप उन्हें कॉल करना चाहते हैं, तो क्लासिक एएसपी और .NET की गड़बड़ है।
  • हमारा डेटाबेस अपवित्र संग्रहित प्रोसेस का एक गुच्छा से भरा हुआ है जिसमें व्यापार तर्क और सत्यापन की हजारों लाइनें शामिल हैं।
  • पहले डेवलपर्स ने "चालाक" समाधान बनाए जो गैर-विस्तारणीय, गैर-पुन: प्रयोज्य हैं, और बहुत स्पष्ट विरोधी पैटर्न प्रदर्शित करते हैं; इन्हें शॉर्ट ऑर्डर में बहिष्कृत करने की आवश्यकता है।

मैं MS Patterns and Practices Architecture Guide काफी भारी मैं एक प्रारंभिक डिजाइन की ओर काम के रूप में संदर्भित किया गया है, लेकिन मैं अभी भी कुछ सुस्त प्रश्न पूछना चाहते हैं इससे पहले कि मैं कुछ भी करने के लिए प्रतिबद्ध।

(उच्च स्तर)

High-level

(गहराई में व्यापार और डाटा परतों)

Business and Data layers in depth

: इससे पहले कि मैं सवाल में मिलता है, यहाँ क्या मैं अब तक वास्तुकला के लिए है

आरेख मूल रूप से दिखाते हैं कि मैं प्रत्येक परत को कई असेंबली में अलग करने का इरादा रखता हूं। तो इस उम्मीदवार वास्तुकला में, हमारे पास ग्यारह असेंबली होगी, जिसमें शीर्षतम परतें शामिल नहीं हैं।

यहाँ टूटने है, प्रत्येक विधानसभा के विवरण के साथ:

  • Company.Project.Common.OperationalManagement: घटकों जो अपवाद संचालन नीतियों, प्रवेश, प्रदर्शन काउंटरों, विन्यास, और ट्रेसिंग लागू होता है।
  • Company.Project.Common.Security: ऐसे घटक शामिल हैं जो प्रमाणीकरण, प्रमाणीकरण और सत्यापन करते हैं।
  • Company.Project.Common.Communication: उन घटकों को शामिल करता है जिनका उपयोग अन्य सेवाओं और अनुप्रयोगों (मूल रूप से पुन: प्रयोज्य डब्ल्यूसीएफ क्लाइंट्स का एक गुच्छा) के साथ संवाद करने के लिए किया जा सकता है।
  • Company.Project.Business.Interfaces: इंटरफेस और अमूर्त कक्षाएं शामिल हैं जिनका उपयोग उच्च स्तर की परतों से व्यापार परत के साथ बातचीत करने के लिए किया जाता है।
  • Company.Project.Business.Workflows: व्यापार वर्कफ़्लो के निर्माण और रखरखाव से संबंधित घटकों और तर्क शामिल हैं।
  • Company.Project.Business.Components: ऐसे घटक शामिल हैं जो व्यवसाय नियमों और सत्यापन को समाहित करते हैं।
  • Company.Project.Business.Entities: डेटा ऑब्जेक्ट्स जो उच्च स्तर पर व्यावसायिक संस्थाओं के प्रतिनिधि हैं। इनमें से कुछ अद्वितीय हो सकते हैं, कुछ डेटा परत से अधिक दानेदार डेटा इकाइयों से बना कंपोजिट हो सकते हैं।
  • Company.Project.Data.Interfaces: इंटरफ़ेस और सार कक्षाएं शामिल हैं जिनका उपयोग एक भंडार शैली में डेटा एक्सेस परत के साथ संवाद करने के लिए किया जाता है।
  • Company.Project.Data.ServiceGateways: सेवा क्लाइंट और घटक शामिल हैं जिनका उपयोग बाहरी सिस्टम से डेटा को कॉल करने और लाने के लिए किया जाता है।
  • Company.Project.Data.Components: ऐसे घटक शामिल हैं जिनका उपयोग डेटाबेस के साथ संवाद करने के लिए किया जाता है।
  • Company.Project.Data.Entities: इसमें अधिक ग्रैन्युलर इकाइयां शामिल हैं जो कम स्तर पर व्यावसायिक डेटा का प्रतिनिधित्व करती हैं, जो किसी डेटाबेस या अन्य डेटा स्रोत को लेनदेन के तरीके में कायम रखने के लिए उपयुक्त होती हैं।

मेरे इरादे है कि यह एक सख्त स्तरित डिजाइन (एक परत केवल सीधे नीचे परत के साथ संवाद कर सकते हैं) और परतों की मॉड्यूलर ब्रेक डाउन उच्च एकता और ढीला संयोजन को बढ़ावा देना चाहिए होना चाहिए। लेकिन मुझे अभी भी कुछ चिंताएं हैं। यहाँ मेरे सवालों का है, जो मुझे लगता है पर्याप्त उद्देश्य है कि वे इतने पर यहां उपयुक्त हैं रहे हैं ...

  1. मानक सम्मेलनों निम्नलिखित प्रत्येक मॉड्यूल और अपने संबंधित विधानसभा के लिए मेरे नामकरण सम्मेलनों हैं, या वहाँ मैं चाहिए एक अलग तरीका है कर रहे हैं इस बारे में जा रहे हो?
  2. क्या कई असेंबली में व्यापार और डेटा परतों को अलग करना फायदेमंद है?
  3. क्या यह प्रत्येक परत के लिए इंटरफेस और अमूर्त कक्षाएं अपने स्वयं के असेंबली में फायदेमंद है?
  4. सबसे महत्वपूर्ण - क्या यह व्यवसाय और डेटा परत दोनों के लिए "संस्थाएं" असेंबली के लिए फायदेमंद है? मेरी चिंता यह है कि यदि आप उन वर्गों को शामिल करते हैं जो डेटा एक्सेस घटकों के अंदर LINQ से SQL द्वारा जेनरेट की जाएंगी, तो कोड आधार में तीन अलग-अलग स्थानों में दी गई इकाई का प्रतिनिधित्व किया जाएगा। स्पष्ट रूप से ऑटोमैपर जैसे टूल मदद करने में सक्षम हो सकते हैं, लेकिन मैं अभी भी 100% नहीं हूं। कारण यह है कि मैंने उन्हें अलग कर दिया है ए - ए सख्त-स्तरित आर्किटेक्चर को लागू करना और बी - परतों के बीच एक लूसर युग्मन को बढ़ावा देना और प्रत्येक इकाई के पीछे व्यापार डोमेन में परिवर्तन करते समय ब्रेकेज को कम करना। हालांकि, मैं उन लोगों से कुछ मार्गदर्शन प्राप्त करना चाहता हूं जो आर्किटेक्चर में ज्यादा अनुभवी हैं।

यदि आप मेरे प्रश्नों का उत्तर दे सकते हैं या मुझे सही दिशा में इंगित कर सकते हैं तो मैं सबसे अधिक आभारी हूं। धन्यवाद।


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

+1

2012-03-05 के रूप में अपडेट करें: हमने योजनाबद्ध रूप से सख्त स्तरित वास्तुकला के साथ जाने का फैसला किया है। हालांकि, मैं अंततः इस निष्कर्ष पर पहुंचा कि अपनी स्वयं की असेंबली में इंटरफेस और अमूर्त वर्गों को केवल वास्तविक लाभ के साथ जटिलता जोड़ा गया था। मैं अभी भी अलग-अलग व्यावसायिक संस्थाओं के दृष्टिकोण के साथ जा रहा हूं, जो डेटा परत में इकाइयों से अलग हैं। यह अमूल्य साबित हुआ है, क्योंकि यह व्यापार परत के पीछे घूमने से डीबी स्कीमा के घृणास्पद विवरण रखता है। दूसरे शब्दों में, यह रेत में एक रेखा खींचने में मदद करता है और सुरक्षा जोड़ा जाता है। –

उत्तर

8

मैं वास्तव में सिर्फ एक ही बात करना शुरू कर दिया, इसलिए उम्मीद है इस में मदद मिलेगी या कम से कम और अधिक टिप्पणियां पैदा करते हैं और यहां तक ​​कि खुद के लिए मदद :)

1. प्रत्येक मॉड्यूल के लिए मेरी नामकरण सम्मेलनों और अपने संबंधित विधानसभा हैं निम्नलिखित मानक सम्मेलनों के बाद, या क्या इस बारे में मुझे एक अलग तरीके से जाना चाहिए?

MSDN Names of Namespaces के अनुसार, यह ठीक लगता है।

<Company>.(<Product>|<Technology>)[.<Feature>][.<Subnamespace>]
For example, Microsoft.WindowsMobile.DirectX.

यह 2.Is कई विधानसभाओं में व्यापार और डेटा परतों अलग तोड़ने के लिए फायदेमंद: वे के रूप में इसे बाहर रखना?

मैं निश्चित रूप से कई विधानसभाओं में व्यापार और डेटा परतों अलग तोड़ने के लिए अपनी फायदेमंद लगता है। हालांकि, मेरे समाधान में, मैंने केवल दो विधानसभाएं बनाई हैं (डेटालेयर और बिजनेसलेयर)। अन्य विवरण जैसे Interfaces, Workflows, आदि मैं प्रत्येक असेंबली के तहत निर्देशिका तैयार करता हूं। मुझे नहीं लगता कि आपको उस स्तर पर उन्हें विभाजित करने की जरूरत है।

3. क्या यह प्रत्येक परत के लिए इंटरफेस और अमूर्त कक्षाएं अपने स्वयं के असेंबली में फायदेमंद है?

उपर्युक्त टिप्पणियों के साथ-साथ चला जाता है।

4.Is यह फायदेमंद दोनों व्यापार और डेटा परतों के लिए एक "इकाइयों" विधानसभा के लिए?

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

Service Layer Details http://i.msdn.microsoft.com/dynimg/IC350997.png

+0

मैं आपको निशान दे रहा हूं क्योंकि # 4 के लिए आपका उत्तर बिल्कुल पुष्टि थी जिसे मैं ढूंढ रहा था। मुझे लगता है कि मेरे विशेष मामले में अनावश्यकता के लिए उपयुक्त है क्योंकि ओआरएम द्वारा उत्पन्न की जाने वाली संस्थाएं डेटाबेस स्कीमा के डरावनी प्रतिबिंबित होंगी, जिसे मैं कंक्रीट डेटा एक्सेस घटकों के अंदर encapsulated छोड़ना पसंद करूंगा। इसका मतलब डेटा एक्सेस लेयर में कुछ सैनिटी लाने के लिए डेटा इकाइयों का एक अतिरिक्त सेट आवश्यक होगा। क्या आप सहमत हैं? बीटीडब्ल्यू, मैं अभी भी आपके साथ # 3 पर नहीं हूं - हमारे यूनिट परीक्षण और डब्ल्यूसीएफ कार्यान्वयन इसके मूल्य आईएमओ दिखाएंगे। –

+2

@RepoMan - हाँ मैं सहमत हूं। # 3 के लिए, मुझे लगता है कि उन लोगों को अलग करने में असेंबली आपको कुछ भी खरीदने जा रही है। संभावित रूप से वे कंपनी के अंतर्गत आने के बाद से संबंधित हैं। प्रोजेक्ट, इसलिए वे परियोजना विशिष्ट हैं और अन्य परियोजनाओं पर पुन: उपयोग करने के लिए सामान्य नहीं हैं। आईडी उन्हें एक ही असेंबली में रखती है और यूनिट परीक्षण के लिए अपनी कंपनी का उपयोग करें। Prject.X.Test। – SwDevMan81

+0

यह पता चला है कि आप लगभग # 3 के बाद सही थे। मैंने अपनी मूल पोस्ट में जो टिप्पणी जोड़ा है उसे देखें। –

14

मैं एक onion architecture के पक्ष में इस मानक स्तरित वास्तुकला से असहमत हैं।

enter image description here

कि के अनुसार, मैं आपके प्रश्नों पर एक कोशिश दे सकते हैं:

1. मानक सम्मेलनों निम्नलिखित प्रत्येक मॉड्यूल और अपने संबंधित विधानसभा के लिए मेरे नामकरण सम्मेलनों हैं, या वहाँ एक है अलग-अलग तरीके से मैं इस बारे में जाना चाहिए?

हाँ, मैं मानता हूं कि यह एक बुरा सम्मेलन नहीं है, और काफी मानक है।

2. यह कई विधानसभाओं में व्यापार और डेटा परतों अलग तोड़ने के लिए फायदेमंद है?

हाँ, पर मैं नहीं बल्कि एक विधानसभा है डोमेन (आमतौर पर Core.Domain) और अन्य डेटा (Core.Data) नामक एक कहा जाता है। डोमेन असेंबली में सभी संस्थाएं (डोमेन-संचालित-डिजाइन के अनुसार) भंडार इंटरफेस, सेवाओं, कारखानों आदि के साथ ... डेटा असेंबली डोमेन का संदर्भ देती है और एक ओआरएम के साथ ठोस भंडार लागू करती है।

3. यह इंटरफेस और अपने स्वयं के विधानसभाओं में प्रत्येक परत के लिए अमूर्त वर्ग के लिए फायदेमंद है?

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

4. क्या यह व्यवसाय और डेटा परत दोनों के लिए "संस्थाएं" असेंबली के लिए फायदेमंद है?

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

यदि आप एक नया आर्किटेक्चर शुरू कर रहे हैं, तो आप यहां जोड़ने के लिए एक चीज भी जोड़ रहे हैं, और आप 10 साल के लिए पहले से मौजूद एक ऐसे एप्लिकेशन के बारे में बात कर रहे हैं, आपको LINQ-to-SQL से बेहतर ORM टूल पर विचार करना चाहिए, या तो इकाई फ्रेमवर्क या NHibernate (मैं अपनी राय में NHibernate के लिए चुनते हैं)।

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

+0

यकीन नहीं है कि मैं प्याज वास्तुकला पर बहुत उत्सुक हूं लेकिन आपके अन्य उत्तरों के लिए +1 हूं। –

+0

मेरी राय में, प्याज आर्किटेक्चर के बारे में सबसे अच्छी बात यह है कि आपका डोमेन नियम हो, और अब तक मुझे यह पता चला है कि यह सर्वोत्तम वास्तुकला निर्णय है। डेटा और डेटा चिंताओं को केवल एक आवेदन के लिए एक साइड-समस्या होना चाहिए। प्याज वास्तुकला के लिए –

+4

+1। –

2

1) नामकरण बिल्कुल ठीक है, जैसे SwDevMan81 ने कहा।

2) बिल्कुल, अगर कुछ वर्षों में डब्ल्यूसीएफ पुराना हो जाता है, तो आपको केवल अपना डीएएल बदलना होगा।

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

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

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

एचटीएच,

bab।

संपादित करें:here वीडियो है।

+0

"एकमात्र कारण मैं वास्तव में एक ही दिखने वाली वस्तु के लगभग 3 गुना स्थानांतरित करने के बारे में सोच सकता हूं, खराब डिजाइन है: डेटाबेस संबंधों को खराब तरीके से तैयार किया गया था, और इस प्रकार आपको उन वस्तुओं को ट्विक करना होगा जो आपके साथ काम कर सकते हैं। " - बिंगो! मैं इसे प्रतिबिंबित करने के लिए अपने प्रश्न को संपादित करने जा रहा हूं क्योंकि मुझे शायद इसे शुरू करने के लिए कहा जाना चाहिए था। –

+0

बिंदु # 3 के लिए, चूंकि मेरे ठोस कार्यान्वयन असेंबली बी में हैं, इसलिए मुझे दोनों असेंबली को सही तरीके से संदर्भित करना होगा? आपके पक्ष के नोट के लिए, क्या आप कह रहे हैं कि मुझे केवल व्यापार परत से इंटरफेस लेना चाहिए, उन्हें [ServiceContract] के रूप में सजाने के लिए और सीधे मेरी डब्ल्यूसीएफ सेवाओं में उनका उपयोग करना चाहिए? –

+1

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