2009-01-27 19 views
7

मैं एक 3-स्तरीय नेट सेवा एप्लिकेशन है, जो मानक दृष्टिकोण निम्नानुसार है:एन-स्तरीय एप्लिकेशन में निर्भरता इंजेक्शन?

Frontend -> Object Model/Business Logic -> Data Access 

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

वर्तमान में मेरे पास फ्रंटेंड में एक कक्षा है जो डी कंटेनर को कॉन्फ़िगर करती है। यह मूल रूप से container.Register<SomeType>() कहकर कोड का एक बड़ा समूह है और इसी तरह।

समस्या यह है कि यह सभी 3 स्तरों के लिए कंटेनर को कॉन्फ़िगर कर रहा है, और इसलिए डेटा एक्सेस लेयर का काफी आक्रामक ज्ञान होना चाहिए। इस तरह के ज्ञान के साथ मेरे अग्रभाग में कोड रखने से ऐप को अलग करने के बिंदु के रूप में मेरे सिर में अलार्म घंटी बंद हो जाती है, इस सटीक स्थिति से बचने के लिए।
यह भी इस तथ्य से भी बदतर हो गया है कि मेरी डेटा एक्सेस लेयर सिर्फ SQL सर्वर बिट्स की गूंगा बाल्टी नहीं है, लेकिन जटिल कॉम इंटरऑप और पी/इनवॉक कॉल के बहुत सारे हैं, इसलिए इसका काफी असर पड़ता है डी विन्यास।

मैंने इसे तोड़ने के लिए कुछ विचार दिया है - शायद प्रत्येक स्तर में एक कंटेनर है, या प्रत्येक स्तर में "सेटअप" कक्षा है जो वैश्विक डी कंटेनर से बात करती है ताकि वह अपने स्वयं के बिट्स पंजीकृत कर सके, लेकिन मुझे यकीन नहीं है अगर इससे हल होने से अधिक समस्याएं उत्पन्न हो जाएंगी ...

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

धन्यवाद, ओरियन।

+0

क्या आपके पास सेवा परत जैसा कुछ भी है? ताकि आपका फ्रंट एंड बिजनेस ऑब्जेक्ट्स से पहले इसके साथ बातचीत कर सके। – BuddyJoe

+0

मुझे यकीन नहीं है कि मैं "सेवा परत" से आपका क्या मतलब है ... "सेवा" इन दिनों इस तरह के दुर्व्यवहारिक शब्द है :-( –

उत्तर

2

यह इस बात पर निर्भर करता है कि आपके पास तीन स्तर (भौतिक अलगाव) हैं या यदि आपके सभी तार्किक परतों को एक साथ तैनात किया गया है। यदि फ्रंटएंड आपके बीएल से अलग है और एक webservice या डब्ल्यूसीएफ के माध्यम से संचार करता है तो फ्रंटेंड और बैकएंड को अपने कंटेनरों की आवश्यकता होती है क्योंकि वे अलग प्रक्रियाओं या अलग मशीनों में चल रहे हैं। कंटेनर केवल अपने स्वयं के घटकों और 'अगली' परत के इंटरफेस पंजीकृत करेंगे।

दूसरी ओर यदि सभी परतें एक ही प्रक्रिया में चल रही हैं तो आपके पास केवल एक कंटेनर होना चाहिए। कंटेनर को वेब ऐप के लिए global.asax जैसे एप्लिकेशन के प्रारंभिक बिंदु में प्रारंभ और होस्ट किया जाएगा।

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

Kernel.Register(AllTypes.Pick().FromAssemblyName("DataAccessLayer.dll")); 
Kernel.Register(AllTypes.Pick().FromAssemblyName("BusinessLogic.dll"));