2011-01-26 15 views
5

मैं अपने एन-लेयर आर्किटेक्चर का पुनर्मूल्यांकन करने की कोशिश कर रहा हूं और आपके अनुभवों के आधार पर कुछ सुझाव प्राप्त करना पसंद करूंगा। यहां हमारी सामान्य .NET एन-लेयर (कभी-कभी एन-स्तरीय) डिज़ाइन है।एन-लेयर व्यवसाय/सेवा परत डिजाइन

Project.UI 
Project.Services 
Project.Business 
Project.Model 
Project.DataAccess 

DataAccess आम तौर पर Entity Framework 4 और Repository वर्गों के होते हैं। मैं टेबल के लिए भंडार रखने से बचने के लिए Aggregate Root अवधारणा का पालन करने का प्रयास करता हूं, मेरे अनुभव में किए गए आसान से कहा जाता है। मेरे पास रिपोजिटरीज और टेबल्स के बीच ~ 70% मैच होता है।

मॉडल में आमतौर पर मेरी Entity Framework 4 इकाइयां होती हैं, मैं सफलतापूर्वक स्व-ट्रैकिंग ईएफ इकाइयों का उपयोग कर रहा हूं।

व्यवसाय मैं सबसे ज्यादा संघर्ष करता हूं। मेरे पास आमतौर पर प्रत्येक Repository के लिए Manager कक्षा होती है। इस श्रेणी में विधियां शामिल होंगी .एड() जो रिपोजिटरी को अग्रेषित करने से पहले व्यावसायिक सत्यापन करेगा। जोड़ें()।

सेवाएं, आम तौर पर मैं केवल इसे लागू कर दूंगा यदि वास्तव में मैं एक वेब सेवा आधारित समाधान बनाना चाहता हूं। इस परत को डीटीओ और संस्थाओं के बीच मार्शलिंग अनुरोध/प्रतिक्रियाओं के साथ काम किया जाएगा। और सबसे महत्वपूर्ण रूप से अधिक coarse grained इंटरफेस प्रदान करते हैं। उदाहरण के लिए एक TradingService.SubmitTrade() है, जो वास्तव में एक facade एक व्यापार लेनदेन जो AccountManager.ValidateCash(), OrderManager.SubmitOrder(), शामिल हो सकता है के लिए है आदि

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

मुझे अपने डिजाइन को इस तरह से पसंद है कि मैं एक व्यवसाय का पुन: उपयोग कर सकता हूं कई सेवा कॉल में परत विधि, हालांकि मुझे इस तथ्य से नफरत है कि प्रत्येक भंडार के लिए मेरे पास एक मिलान करने वाला व्यवसाय परत प्रबंधक है, जो अतिरिक्त काम करता है। शायद समाधान बिजनेस लेयर स्तर पर समूह का एक अलग प्रकार है? उदाहरण के लिए ContactManager (नोट मेरे पास "संपर्क" इकाई प्रकार नहीं है) जैसे लॉजिकल मैनेजर क्लास में फोनमैनेजर और ईमेल मैनेजर (नोट मेरे पास फोन इकाइयां और ईमेल इकाइयां हैं) के व्यक्तिगत प्रबंधक वर्गों को गठबंधन करें। ContactManager.GetPhones() और ContactManager.GetEmail(), आदि जैसे विधियों के साथ

मुझे लगता है कि मैं कुछ भी सोच रहा हूं कि दूसरों को कैसे व्यवस्थित करना है और जिम्मेदारियों का प्रतिनिधित्व करना है, भले ही उनके पास सेवा परत, व्यापार परत, दोनों आदि हों। ओआरएम संदर्भ संदर्भ, आदि

उत्तर

2

मैं आपकी चिंताओं के अंत के बारे में बताता हूं, और व्यापार परत समूह की चीजों में प्रबंधकों में जो व्यवसाय के दृष्टिकोण से अधिक तार्किक अर्थ बनाता है।

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

हमारे पर्यावरण में जो कुछ है, वह डेटाबेस/इकाई परत है, फिर एक व्यापार परत जो सर्वर पर बैठती है और व्यवसाय नियमों और व्यावसायिक तर्कों को संभालती है। उस व्यापार परत को डब्ल्यूसीएफ के माध्यम से ग्राहक के रूप में उजागर किया जाता है (या कम से कम, ग्राहकों के लिए प्रासंगिक सामान है)।

ऐसा लगता है कि आप पहले से ही जानते हैं कि आप क्या करना चाहते हैं, इसलिए मैं इस पर थोड़ा प्रोटोटाइप काम करने का सुझाव देता हूं और देखता हूं कि यह आपके लिए कैसे काम करता है। :)

+0

क्या आपके पास कभी भी एक सेवा कॉल है जो कई व्यवसाय प्रबंधक वर्गों को फैलाती है? दूसरे शब्दों में, आपका सेवा इंटरफ़ेस व्यवसाय प्रबंधकों की तुलना में और भी मोटे अनाज हो सकता है। उदाहरण के लिए ContactService.CreateUser(), UserManager.CreateUser() और ContactManager.AddEmail(), और ContactManager.AddPhone(), आदि को प्रतिनिधि (एक मुखौटा के रूप में सेवा) प्रतिनिधि करेगा। भले ही हमने संपर्क मैनेजर में ईमेल और फ़ोन से संबंधित तर्क को समूहीकृत किया हो , फोन रिपोजिटरी और ईमेल रिपोजिटरी रखने में कुछ भी गलत नहीं है। ऐसा लगता है कि Repositories प्रबंधकों की तरह "तार्किक" नहीं हो सकता है। – e36M3

+0

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

+0

मुझे पता है कि आपका क्या मतलब है, मैं अपने प्रबंधकों को रचनाकार के माध्यम से आवश्यक भंडार प्रदान करने के लिए DI का उपयोग करता हूं। एक प्रबंधक को एक और प्रबंधक बनाने के लिए प्रबंधकों को डी कंटेनर से अवगत होना आवश्यक होगा। हालांकि इसके बिना ऐसा लगता है कि कभी-कभी मैं कॉपी और पेस्ट करके तर्क को डुप्लिकेट कर रहा हूं। उदाहरण के लिए DataEntryManager.EnterPrice() और FileManager.UploadPriceFile()। आप कल्पना कर सकते हैं कि "मूल्य फ़ाइल" को पार्स करने के बाद हमें कीमतें डालना होगा। मैं या तो उस तर्क के कुछ डुप्लिकेट कर सकता हूं या FileManager DataEntryManager का पुन: उपयोग कर सकता हूं। – e36M3

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