2008-10-01 16 views
5

मैं एक डी नौसिखिया का थोड़ा सा हूँ, तो मुझे माफ कर दो अगर यह गलत दृष्टिकोण है या मूर्ख सवाल है।मुझे डीआई/आईओसी के लिए अपने सीटीआर पैरामीटर को कैसे ऑर्डर करना चाहिए?

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

तो मैं सेवाओं को आपूर्ति करने के लिए अपना आईओसी कंटेनर (जो भी मैं साथ जाऊंगा) चाहता हूं, लेकिन ऑर्डर ऑब्जेक्ट को संपादित करने के लिए कॉलिंग कोड पर निर्भर होगा।

मैं पहले पैरामीटर और ProductsService और CustomersService उसके बाद के रूप में आदेश वस्तु लेने के रूप में निर्माता की घोषणा करना चाहिए, जैसे:

public OrderForm(Order order, ProductsService prodsSvc, CustomersService custsSvc) 

... या निर्भरता पहले आदेश वस्तु पिछले आते हैं और चाहिए, उदाहरण:

public OrderForm(ProductsService prodsSvc, CustomersService custsSvc, Order order) 

क्या इससे कोई फर्क पड़ता है? क्या यह निर्भर करता है कि मैं किस आईओसी कंटेनर का उपयोग करता हूं? या कोई बेहतर तरीका है?

उत्तर

4

मैं @ अकू के उत्तर से असहमत हूं।

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

डीआई के बावजूद, मुझे लगता है कि कम से कम इस तरह के राज्य को वास्तविक स्थिति (ऑर्डर), व्युत्पन्न राज्य (यदि कोई है), और निर्भरता (सेवाएं) जैसे आपके दिमाग में स्पष्ट करना उपयोगी होता है:

http://tech.puredanger.com/2007/09/18/spelunking/

किसी भी निर्माता या विधि पर, मैं वास्तविक डेटा पहले पारित होने के लिए और निर्भरता या बाहरी सामान पिछले पारित किया जाना पसंद करते हैं। तो आपके उदाहरण में मैं पहले पसंद करूंगा।

5

मैट, आपको निर्भरताओं के साथ सामान्य पैरामीटर मिश्रण नहीं करना चाहिए। चूंकि आपकी ऑब्जेक्ट आईओसी कंटेनर के आंतरिक में बनाई जाएगी, आप आवश्यक तर्क निर्दिष्ट करने के लिए कैसे जा रहे हैं?

मिश्रित निर्भरता और सामान्य तर्क आपके प्रोग्राम का तर्क अधिक जटिल बना देंगे।

इस मामले में यह बेहतर हो निर्भरता गुण घोषित करने के लिए करता था (उदाहरण निर्माता से निर्भरता निकालने के लिए) या प्रारंभ आदेश क्षेत्र आईओसी OrderForm का निर्माण किया और संकल्प लिया यह है के बाद निर्भरता (अर्थात निर्माता से सामान्य मापदंडों निकालने के लिए)।

इसके अलावा आप ऑर्डर सहित निर्भरताओं के रूप में अपने सभी पैरामीटर घोषित कर सकते हैं।

+0

ठीक है, यह समझ में आता है। तो या तो मैं अपनी सभी निर्भरताओं के लिए संपत्ति इंजेक्शन का उपयोग करता हूं, या केवल सीटीआर में निर्भरता पास करता हूं और "आवश्यक" ऑब्जेक्ट के लिए एक संपत्ति पेश करता हूं? –

+0

हाँ, आप सही हैं। डीपी और सामान्य गुणों को मिश्रण न करें क्योंकि यह अप्रत्याशित समस्याओं का कारण बन सकता है और उपयुक्त आईओसी ढांचे की सीमा को सीमित कर सकता है। – aku

3

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

मुझे लगता है कि मुझे यह जानने में कुछ आराम मिल सकता है कि ऑर्डरफॉर्म ऑब्जेक्ट केवल फैक्टरी विधि द्वारा तत्काल किया जाएगा जो सुनिश्चित करता है कि आईओसी फ्रेमवर्क को कॉल करने के बाद आदेश संपत्ति सेट की गई है।

+0

मेरे उत्तर में मैंने अनिवार्य ** आदेश ** पैरामीटर के साथ कई दृष्टिकोणों का प्रस्ताव दिया। प्रश्न हालांकि डीपी और सामान्य गुणों को मिलाकर थे। मेरा जवाब है - मिश्रण मत करो। मुझे रचनात्मक आलोचना सुनकर खुशी होगी। – aku