GUI, BLL, DAL संगठन एक परियोजना में


9

मैं एप्लिकेशन परतों के बारे में पढ़ रहा हूं, और अपने अगले प्रोजेक्ट (c #, .Net) में इस डिज़ाइन का उपयोग करना चाहता हूं। कुछ सवाल:

  1. क्या नामस्थानों के माध्यम से परतों का पृथक्करण किया जाता है? Project.BLL.Whatever, Project.DAL.Whatever

  2. क्या परतों द्वारा अलग करना अधिक उचित है, फिर घटक (Project.BLL.Component1), या घटकों द्वारा, फिर परतें (Project.Component1.BLL)

  3. मेरे DAL के लिए, क्या यह परत आगे विभिन्न वर्गों का उपयोग करके आयोजित की जाती है? यदि सभी डेटाबेस कॉल को एक ही वर्ग में रखा जाता है, तो कोई संगठन नहीं है। क्या इन्हें अलग-अलग वर्गों या नामस्थानों के साथ विभाजित करना बेहतर होगा?

  4. क्या DAL कक्षाएं आम तौर पर स्थिर होती हैं? यह हर बार अपने तरीकों में से एक को कॉल करने से पहले एक डीएएल वस्तु को पलटने के लिए बोझिल लगता है।

इन परतों के साथ चीजों को सही तरीके से करने के लिए कोई अन्य सुझाव की सराहना की जाएगी।

जवाबों:


8
  1. हाँ। और असेंबली भी।
  2. मैं परतों से अलग होता, फिर घटक।
  3. हाँ। इसके लिए अलग-अलग दृष्टिकोण हैं, लेकिन मेरे पास एक IDatabaseService (विभिन्न शिष्टाचारों को सार करना जिसमें डेटाबेस कहा जाता है - यह लगभग ExecuteScalar / ExecuteNonQuery / ExecuteReader का प्रत्यक्ष मानचित्रण हो सकता है) और फिर विभिन्न डेटा एक्सेस क्लासेस डेटा के प्रकार से विभाजन। उदाहरण के लिए, आप एक UserDataAccess वर्ग हो सकता है जिसमें उपयोगकर्ता वस्तुओं को बनाने / संशोधित करने / हटाने के लिए सरल CRUD विधियाँ होंगी। एक अन्य दृष्टिकोण के लिए एक उपयोगकर्ता वस्तु होगी जिसमें CRUD का निर्माण सही है।
  4. नहीं। यह इकाई परीक्षण के लिए बहुत कठिन है। आपको प्रत्येक डेटा एक्सेस क्लास (जैसे IDatabaseService) के निर्माता के लिए निर्भरता में पास होने के लिए निर्भरता इंजेक्शन का उपयोग करना चाहिए । फिर आप इस तरह से डेटा ऑब्जेक्ट्स को व्यावसायिक वस्तुओं में पास करेंगे:

    BusinessObject BusinessObject = नया BusinessObject (नया DataAccessObject (नया DatabaseService ())); businessObject.PerformOperation ();

प्रत्येक व्यावसायिक ऑब्जेक्ट को कई डेटा एक्सेस ऑब्जेक्ट की आवश्यकता हो सकती है। आपका GUI कोड भी एक या अधिक व्यावसायिक वस्तुओं का उपयोग करेगा। कुछ व्यावसायिक वस्तुओं को किसी भी डेटा एक्सेस ऑब्जेक्ट की आवश्यकता नहीं हो सकती है, लेकिन कभी भी सीधे IDatabaseService का उपयोग नहीं करना चाहिए।


तो BusinessObject.PerformOperation () कुछ इस तरह दिखेगा: DataAccessObject.PerformOperation (), DataAccessObject का एक उदाहरण BusinessObject में रहता है?
sooprise

1
इसके अलावा, निर्भरता इंजेक्शन के बारे में टिप के लिए धन्यवाद। यह मेरे लिए एक नई अवधारणा है, और यह अच्छी समझ में आता है। मैं इसके बारे में अधिक जानने के लिए होगा :)
सोप

@sooprise Right - आपकी व्यावसायिक वस्तुओं को डेटा एक्सेस ऑब्जेक्ट्स पर काम करना चाहिए जो निजी सदस्यों के रूप में रहते हैं। खुशी है कि आप निर्भरता इंजेक्शन के बारे में टिप की सराहना करते हैं। यह बनाए रखने योग्य और परीक्षण योग्य सॉफ्टवेयर डिजाइन के लिए एक महत्वपूर्ण अवधारणा है। आपका बहुत स्वागत है!
मैथ्यू रोडैटस

2

प्रश्न 1 और 2 के लिए मैथ्यू के उत्तरों के साथ जाते हैं।

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

प्रत्येक डीएएल को इस तरह की कार्यक्षमता की आवश्यकता नहीं है, लेकिन मैंने सीखा है कि दृष्टिकोण (यानी एकल डेटा प्रदाता और स्थैतिक पंजीकरण के साथ सरल डीएएल कक्षाएं) ने मेरे जीवन को बहुत आसान बना दिया जब मैंने नई कक्षाएं जोड़ना शुरू किया।

मैं निश्चित रूप से उच्च स्तर की कक्षाओं में CRUD के निर्माण की सिफारिश नहीं करूंगा, जब तक कि यह एक बहुत ही सरल अनुप्रयोग न हो। DAL डेटा स्टोरेज का एक अमूर्त हिस्सा है। यदि आप भविष्य में अपने डेटा स्टोरेज को किसी बिंदु पर बदलने का निर्णय लेते हैं (भले ही यह केवल MS SQL के बजाय MySQL का उपयोग करने के लिए हो), तो आप इसके लिए बहुत आभारी होंगे। प्लस: बीएलएल वस्तुओं को उनके व्यापारिक तर्क संबंधों द्वारा संरचित किया जाना चाहिए। डीएएल ऑब्जेक्ट्स को स्टोरेज कंटेनरों के प्रकार से संरचित किया जाता है जो वे प्रतिनिधित्व करते हैं। मतभेद नाटकीय हो सकते हैं।

करो नहीं अपने DAL कक्षाएं स्थिर हैं। आप कोडिंग गति में क्या हासिल करते हैं आप परीक्षण क्षमता और लचीलेपन में कई बार खो देंगे।


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

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

मेरे दृष्टिकोण की एक विस्तृत व्याख्या मुझे टिप्पणियों में यहाँ प्रदान करने की तुलना में बहुत अधिक भर देगी। मुझे अपना ईमेल पता भेजें और मैं उत्तर दूंगा (wolfgangs at manticoreit dot com)
wolfgangsz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.