2009-07-24 10 views
5

के साथ कन्स्ट्रक्टर सूप से परहेज करना मेरे पास बेसकंट्रोलर है जिसका उपयोग मैं एक एमवीसी परियोजना के लिए अपनी क्रॉस कटिंग चिंताओं को घर बनाने के लिए कर रहा हूं।आईओसी के साथ एएसपीएनटी एमवीसी -> बेसकंट्रोलर

हालांकि, इसका मतलब है कि मेरी नियंत्रक 3 निर्भरता है:

public BaseController (IUserService u, ITenantDetailsService t, ISiteConfiguration c) 

इस के दुष्प्रभाव यह है कि प्रत्येक व्युत्पन्न नियंत्रक के लिए मेरे कंस्ट्रक्टर्स मानकों से अटा पड़ा हैं:

public AccountController(ILocationService locationService, IAccountService accountService, IFormsAuthentication formsAuth, IMembershipService service, IUserService userService, ISiteConfiguration configuration) 
     : base(locationService,userService, configuration) 

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

क्या कुछ निर्भरताओं को मास्क करने के अलावा ऐसा करने का कोई कारण नहीं है?

public AccountController (IAccountService, IFormsAuthentication, IMembershipService) 

यह दृष्टिकोण अधिक पठनीय लगता है और उस विशिष्ट नियंत्रक से संबंधित निर्भरताओं का स्पष्ट अवलोकन देता है।

या क्या मुझे यह सब गलत मिला है और क्रॉस कटिंग सेवाओं को स्टोर करने के लिए बेसकंट्रोलर सही जगह नहीं है।

विचारों की सराहना की।

धन्यवाद, क्रिस

उत्तर

1

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

निर्भरता इंजेक्शन आपके काम को सरल बनाना है (मुझे लगता है कि यह DI का उपयोग करने का सबसे महत्वपूर्ण कारण नहीं है, लेकिन मुझे लगता है कि यह एक वैध कारण है), इसे किसी भी कठिन नहीं बनाते। एक स्थिति पर विचार करें जब आपको एक और "वैश्विक" सेवा जोड़नी होगी। आपको अपनी परियोजना में हर नियंत्रक के माध्यम से जाना होगा और एक कन्स्ट्रक्टर को संशोधित करना होगा, जो वास्तव में वास्तव में बुरा है।

मैं इस समस्या को हल करने के लिए एक और विचार के साथ आया: एक कलेक्टर ऑब्जेक्ट बनाएं, जो सभी "वैश्विक" निर्भरताओं को संग्रहीत करता है, इसे ठोस नियंत्रकों को पास कर लेता है, फिर आधार पर पास किया जाता है, जो आवश्यक निर्भरता प्राप्त करेगा। यह निर्भरताओं को जोड़ने में समस्या का समाधान करेगा और आप स्पष्ट रूप से बताएंगे कि ठोस नियंत्रक आधार वर्ग पर निर्भरता पारित कर रहा है। हालांकि मुझे यह पसंद नहीं आया, क्योंकि जब भी मैं नई, "वैश्विक" निर्भरता जोड़ रहा हूं, तब भी इसे 2 वर्गों को बदलने के लिए ("निर्भरता कलेक्टर" और बेसकंट्रोलर) की आवश्यकता होती है।

+0

मुझे आपकी दृष्टिकोण बहुत पसंद है क्योंकि एक निर्भरता यह स्पष्ट करती है कि जादू बस नहीं होता है। – Chris

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