दिलचस्प पोस्ट
मॉनिटर सभी जावास्क्रिप्ट ऑब्जेक्ट गुण (मैजिक गेस्टर्स और सेटर्स) जेलेयर पेन और पेंटिंग JTable कैसे तैयार करें एडिटर काम करता है क्या मेयर्स का सिंगलटन पैटर्न थ्रेड सुरक्षित है? सीएसएस में सभी बाल तत्वों को बार-बार चुनें स्विफ्ट में एक प्रकार के लिए प्रदर्शित किए गए पाठ प्रतिनिधित्व को मैं कैसे बदल सकता हूं? जावा / जाव / जावों के बीच का अंतर आरएमआई क्लाइंट-सर्वर आर्किटेक्चर को व्यवस्थित कैसे करें Wchar_t * को char * कैसे परिवर्तित करें? बास में सूचक को निर्दिष्ट किए बिना सरणी में एक नया तत्व जोड़ें जावा enum और अतिरिक्त वर्ग फ़ाइलें मैं एक बिटमैप ऑब्जेक्ट को एक गतिविधि से दूसरे में कैसे पारित कर सकता हूं? कैसे मैं एक बड़े बफ़र बनाने के बिना एक एसक्यूएल सर्वर ब्लॉब में .net ऑब्जेक्ट का एक बड़ा ग्राफ serialize? सर्वलेट आधारित वेब अनुप्रयोग में पृष्ठभूमि कार्य कैसे चलाना है? कैसे अजगर में इनपुट स्ट्रीम फ्लश?

डिजाइन – विंडसर का उपयोग करते समय ऑब्जेक्ट्स को पंजीकृत किया जाना चाहिए

मेरे पास मेरे आवेदन में निम्नलिखित घटक होंगे I

  • डेटा प्राप्त करना
  • DataAccess.Test
  • व्यापार
  • Business.Test
  • आवेदन

मैं एक साथ परतों को गोंद करने के लिए IoC के रूप में कैसल विंडसर का उपयोग करने की उम्मीद कर रहा था, लेकिन मैं इस gluing के डिजाइन के बारे में थोड़ा अनिश्चित हूँ

मेरा प्रश्न है कि ऑब्जेक्ट्स को विंडसर में दर्ज करने के लिए जिम्मेदार कौन होना चाहिए? मेरे पास कुछ विचार हैं;

  1. प्रत्येक परत अपनी स्वयं की वस्तुओं को पंजीकृत कर सकती है। बीएल परीक्षण करने के लिए, परीक्षण बेंच डीएएल के लिए नकली कक्षाएं पंजीकृत कर सकता है।
  2. प्रत्येक परत अपनी निर्भरता के ऑब्जेक्ट को रजिस्टर कर सकती है, जैसे कि व्यावसायिक स्तर डाटा एक्सेस परत के घटक रजिस्टर करता है। बीएल परीक्षण करने के लिए, परीक्षण बेंच को "वास्तविक" डीएएल ऑब्जेक्ट को अनलोड करने और नकली वस्तुओं को पंजीकृत करना होगा।
  3. आवेदन (या परीक्षण ऐप) निर्भरता के सभी ऑब्जेक्ट पंजीकृत करता है

क्या कोई मुझे अलग-अलग रास्तों के साथ कुछ विचारों और पेशेवरों के साथ मदद कर सकता है? इस तरह से कैसल विंडसर का उपयोग करने वाले उदाहरणों के लिए लिंक बहुत उपयोगी होंगे

Solutions Collecting From Web of "डिजाइन – विंडसर का उपयोग करते समय ऑब्जेक्ट्स को पंजीकृत किया जाना चाहिए"

सामान्य तौर पर, एक आवेदन में सभी घटकों को यथासंभव देर तक बना दिया जाना चाहिए, क्योंकि यह अधिकतम मॉड्यूलरिटी सुनिश्चित करता है, और वह मॉड्यूल जितना संभव हो उतना ढीला युग्मित होता है।

व्यवहार में, इसका मतलब है कि आपको अपने आवेदन की जड़ में कंटेनर को कॉन्फ़िगर करना चाहिए।

  • डेस्कटॉप ऐप में, यह मुख्य विधि में होगा (या इसके बहुत करीब)
  • एएसपी। नेट (एमवीसी सहित) आवेदन में, जो कि ग्लोबल.एएसएक्स में होगा
  • डब्लूसीएफ में, यह एक सेवाहोस्टफ़ैक्ट्री में होगा
  • आदि।

कंटेनर बस इंजन है जो एक कामकाजी आवेदन में मॉड्यूल को बना देता है। सिद्धांत रूप में, आप हाथ से कोड लिख सकते हैं (इसे पुअर मैन की डी कहा जाता है), लेकिन विंडसर की तरह डी डि कंटेनर का इस्तेमाल करना इतना आसान है

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

आपके परीक्षणों को कंटेनर की बिल्कुल भी ज़रूरत नहीं होनी चाहिए, क्योंकि आपके ऑब्जेक्ट्स और मॉड्यूल को कंपोज़ योग्य होना चाहिए, और आप यूनिट टेस्ट से सीधे टेस्ट डबल्स की आपूर्ति कर सकते हैं। यह सबसे अच्छा है यदि आप अपने सभी मॉड्यूल को कंटेनर-अज्ञेयवादी बना सकते हैं।

इसके अलावा विशेष रूप से विंडसर में आपको अपने घटक पंजीकरण तर्क को इंस्टॉलर के भीतर समाहित करना चाहिए ( IWindsorInstaller लागू करने वाले प्रकार) अधिक जानकारी के लिए दस्तावेज़ीकरण देखें

जबकि मार्क का जवाब वेब परिदृश्यों के लिए महान है, सभी आर्किटेक्चर (अर्थात् अमीर-ग्राहक – अर्थात: WPF, WinForms, IOS, आदि) के लिए इसे लागू करने के साथ प्रमुख दोष यह धारणा है कि ऑपरेशन के लिए आवश्यक सभी घटकों को बनाया जा सकता है / बनाया जाना चाहिए तुरंत।

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

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

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

ऐसा क्यों बुरा है कि मेरे उपयोगकर्ता-कोड को डि कंटेनर तक पहुंच है?

1) निर्भरता कंटेनर आपके ऐप के बहुत सारे घटकों के संदर्भ में रखता है। इस बुरे लड़के को हर घटक के पास पास करते हुए, जो कि एनोटर उप-घटक बनाने / प्रबंधित करने की आवश्यकता होती है, वह आपके आर्किटेक्चर में ग्लोबल्स का उपयोग करने के बराबर है। किसी भी उप-घटक से भी बदतर भी कंटेनर में नए घटकों को पंजीकृत कर सकते हैं ताकि जल्द ही यह वैश्विक भंडारण भी बन जाए। डेवलपर्स ऑब्जेक्ट्स को कंटेनर में फेंकने के लिए घटकों के बीच डेटा (या तो भाई नियंत्रक के बीच या गहरे नियंत्रक पदानुक्रम के बीच में – यानी: एक पूर्वजों नियंत्रक को एक दादा-दादी नियंत्रक से डेटा प्राप्त करना होगा) के बीच अंतर करना होगा। ध्यान दें कि वेब दुनिया में जहां कंटेनर उपयोगकर्ता कोड के चारों ओर पार नहीं किया जाता है यह कभी भी एक समस्या नहीं है।

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

परिदृश्य ए:

 // not sure whether I'm responsible for creating the thing or not DependencyContainer.GimmeA<Thing>() 

परिदृश्य बी:

 // responsibility is clear that this component is responsible for creation Factory.CreateMeA<Thing>() // or simply new Thing() 

परिदृश्य सी:

 // responsibility is clear that this component is not responsible for creation, but rather only consumption ServiceLocator.GetMeTheExisting<Thing>() // or simply ServiceLocator.Thing 

जैसा कि आप देख सकते हैं डी यह स्पष्ट नहीं करता है कि उप-घटक के जीवनकाल प्रबंधन के लिए कौन जिम्मेदार है।

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

इस सब का क्या मतलब है?

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

रिच-क्लाइंट एप के लिए मेरी सिफारिश न्यूनतम तंत्र का उपयोग करना है जो हाथ में प्रत्येक घटक की आवश्यकताओं को पूरा करती है। 80% समय यह प्रत्यक्ष तात्कालिकता होना चाहिए। सर्विस लोकेटर का उपयोग आपके मुख्य व्यवसाय परत घटकों (यानी: आवेदन सेवाओं जो आम तौर पर प्रकृति में सिंगलटन) को करने के लिए किया जा सकता है, और निश्चित रूप से कारखानों और यहां तक ​​कि सिंगलटन पैटर्न भी उनकी जगह है। कहने के लिए कुछ भी नहीं है कि आप अपनी सेवा स्तर पर निर्भरता और एक ही समय में निर्भर सभी चीजों को बनाने के लिए अपनी सेवा लोकक के पीछे छिपे हुए एक डि फ्रेमवर्क का उपयोग नहीं कर सकते हैं – यदि वह उस स्तर में आपकी ज़िंदगी को आसान बना देता है, और उस परत में ' टी आलसी लोडिंग प्रदर्शित करता है जो अमीर-क्लाइंट प्रस्तुति परतें भारी मात्रा में करते हैं । बस अपने यूजर को उस कंटेनर तक पहुंच से बचाने के लिए सुनिश्चित करें जिससे कि आप उस गड़बड़ी को रोक सकें जो लगभग डि डिटेक्टर पास कर सके।

परीक्षण योग्यता के बारे में क्या?

डीआई फ्रेमवर्क के बिना परीक्षण योग्यता पूरी तरह से हासिल की जा सकती है मैं एक अवरोधन ढांचा का उपयोग करने की सलाह देता हूं जैसे यूनीटबॉक्स (फ्री) या टाइपमॉक ( कीमती ) इन चौखटे आपको उपकरण को हाथ में समस्या (आप सी # # में तात्कालिकता और स्थैतिक कॉलों की नकली कैसे करते हैं) की आवश्यकता रखते हैं, और आपको उनकी पूरी वास्तुकला बदलने की आवश्यकता नहीं है (जो दुर्भाग्यवश है, जहां प्रवृत्ति है .NET / जावा दुनिया में चला गया)। समस्या के हल को खोजने के लिए समझदार है और प्राकृतिक भाषा तंत्र और अंतर्निहित घटकों के लिए अनुकूलतम पैटर्न का उपयोग करें ताकि गोल डि छेद में हर वर्ग के पेग को फिट करने का प्रयास करें। एक बार जब आप इन सरल, अधिक विशिष्ट तंत्रों का उपयोग कर लेंगे तो आप देखेंगे कि आपके कोडेबेस में डि के लिए बहुत कम आवश्यकता है, अगर कोई भी

नोट: MVVM आर्किटेक्चर के लिए

बुनियादी MVVM आर्किटेक्चर में दृश्य-मॉडल प्रभावी रूप से नियंत्रकों की जिम्मेदारी लेते हैं, इसलिए सभी उद्देश्यों के लिए 'नियंत्रक' शब्दों को 'दृश्य-मॉडल' पर लागू करने के लिए विचार करें। मूल एमवीएमएम छोटे ऐप्स के लिए ठीक काम करता है, लेकिन एक ऐप की जटिलता बढ़ती है, इसलिए आप एमवीसीवीवीएम दृष्टिकोण का उपयोग करना चाह सकते हैं। व्यू-मॉडल अधिकतर गूंगा डीटीओ बनने के लिए डेटा बाध्यकारी बनाने में सहायता करते हैं, जबकि व्यापार परत और स्क्रीन / उप-स्क्रीन का प्रतिनिधित्व करने वाले दृश्य-मॉडल के समूहों के बीच अंतर-नियंत्रक / उप-नियंत्रक घटकों में समझाया जाता है। या तो आर्किटेक्चर में नियंत्रकों की ज़िम्मेदारी मौजूद है और ऊपर बताए गए वही लक्षण दर्शाती हैं।