2009-11-19 19 views
7

में IoC का उपयोग करते समय कंटेनर के आसपास कैसे पास नहीं किया जाए IoC की दुनिया में नया हूं और Winforms एप्लिकेशन में इसे लागू करने में कोई समस्या है। मेरे पास एक बेहद बुनियादी अनुप्रयोग विनफॉर्म एप्लिकेशन है जो एमवीसी का उपयोग करता है, यह एक नियंत्रक है जो सभी काम करता है और एक कामकाजी संवाद (जाहिर है नियंत्रक के साथ)। इसलिए मैं अपने सभी कक्षाओं को प्रोग्राम.cs में अपने आईओसी कंटेनर में लोड करता हूं और कंटेनर का उपयोग करके मुख्य फॉर्म नियंत्रक बनाता हूं। लेकिन यह वह जगह है जहां मुझे समस्याएं आ रही हैं, मैं केवल कामकाजी संवाद नियंत्रक बनाना चाहता हूं जब इसका उपयोग किया जाता है और उपयोग कथन के अंदर होता है।Winforms

पहले मैंने कंटेनर में पारित किया लेकिन मैंने पढ़ा है कि यह खराब अभ्यास है और कंटेनर पर अधिक स्थिर है और मैं इस वर्ग का परीक्षण करना चाहता हूं।

तो कंटेनर में गुजरने के बिना आप इकाई परीक्षण अनुकूल तरीके से कक्षाएं कैसे बनाते हैं, मैं अमूर्त फैक्ट्री पैटर्न पर विचार कर रहा था लेकिन वह अकेले आईओसी का उपयोग किए बिना मेरी समस्या का समाधान करेगा।

मैं किसी भी प्रसिद्ध ढांचे का उपयोग नहीं कर रहा हूँ, मैं इस ब्लॉग पोस्ट http://www.kenegozi.com/Blog/2008/01/17/its-my-turn-to-build-an-ioc-container-in-15-minutes-and-33-lines.aspx

मैं कैसे आईओसी के साथ ऐसा करते हैं से एक बुनियादी एक उधार? क्या यह आईओसी के लिए गलत उपयोग है?

उत्तर

7

केन की पोस्ट बहुत रोचक है, लेकिन आप उस बिंदु पर हैं जहां "उत्पादन" आईओसी कंटेनर के बारे में और अधिक सीखने लायक है, क्योंकि कुछ लोग इस परिदृश्य का समर्थन करते हैं।

Autofac में उदाहरण के लिए, आप एक प्रतिनिधि के रूप में एक कारखाने 'उत्पन्न' कर सकते हैं:

builder.RegisterGeneratedFactory<Func<IDialogController>>(); 
फिर अपने मुख्य रूप में

:

class MainForm ... { 

    Func<IDialogController> _controllerFactory; 

    public MainForm(Func<IDialogController> controllerFactory) { ... } 

    void ShowDialog() { 
    using (var controller = _controllerFactory()) 
    { 
    } 
    } 

Autofac रनटाइम पर controllerFactory निर्माता पैरामीटर में भरना होगा । आपके यूनिट परीक्षणों में आप आसानी से कन्स्ट्रक्टर को लैम्ब्डा प्रदान कर सकते हैं।

1

मैं आम तौर पर फैक्ट्री क्लास में एक इंटरफेस में जाता हूं।

+0

मैंने इसके बारे में सोचा लेकिन यह आईओसी पूरी तरह से –

+0

@ एल 2 टाइप की आवश्यकता को दूर नहीं करता है: आईओसी/डी को कंटेनर लाइब्रेरी की आवश्यकता नहीं है - यह आईओसी है। जब आपके पास कई निर्भरताओं वाले वर्ग होते हैं जिनके पास निर्भरता होती है, हालांकि, आप वायरस-अप की सराहना करेंगे कि कंटेनर लाइब्रेरी आपको खरीदती है। – TrueWill

1

आपके कंटेनर सिंगलटन को बनाने वाला एकमात्र उचित समाधान है। आईओसी ढांचे में से कुछ आपके लिए ऐसा करते हैं, लेकिन आपको सिंगलटन के अपने कार्यान्वयन को रोल करना पड़ सकता है। जॉन स्कीट के ideas पर एक नज़र डालें।

विनफॉर्म में एमवीसी के साथ शुभकामनाएं। यह एक सीधी सीखने की वक्र है, कि मैं केवल चढ़ना शुरू कर रहा हूं।

+0

मैंने काम पर पहले WinForms में एमवीसी को लागू करने की कोशिश की है, लेकिन हम एक हाइब्रिड समाधान के साथ समाप्त हो गए हैं जो काफी एमवीसी नहीं है और वास्तव में कुछ भी है। यह एक उग्र संघर्ष है। –

+0

आईओसी कंटेनर के लाभों में से एक सिंगलेट्स से छुटकारा पा रहा है। लाइफटाइम प्रबंधन कंटेनर द्वारा संभाला जाता है। यदि आप कंटेनर को सिंगलटन बनाते हैं, तो आप अपने सभी वर्गों को कंटेनर में जोड़ते हैं और अब एक नज़र में कक्षा की निर्भरता नहीं देख सकते हैं। – TrueWill

+0

मुझे पूरा यकीन नहीं है कि मैं अपनी कक्षा निर्भरताओं को कैसे देख सकता हूं? मुझे ऐप में एक सिंगल सिंगलटन नहीं होना मुश्किल लगता है :) मुझे पता है कि किसी को सिंगलटन की बुद्धिमानी से उपयोग करना चाहिए, लेकिन मुझे लगता है कि यह कुछ मामलों में विनफॉर्म ऐप (और यहां तक ​​कि मध्यम जटिलता वाले) जैसे उचित है। क्या आपको लगता है हर जगह कंटेनर जुनून और इसके द्वारा आपके कोड को प्रदूषित करने और सिंगलटन कंटेनर रखने के अलावा एक और विकल्प है? –