2009-05-06 22 views
19

क्या एकता कंटेनर को किसी ऑब्जेक्ट में पास करने का कोई तरीका है?क्या एकता कंटेनर स्वयं को एक निर्माता पैरामीटर के रूप में संदर्भित कर सकता है?

यानी .:

public class Something { 

    public Something(IUnityContainer container) { 
      ... 
    } 
} 

उत्तर

22

कम जवाब है हां। जब आप Resolve तरीकों का उपयोग

यह स्वचालित रूप से पारित किया जाना चाहिए।

उदाहरण के लिए:

IUnityContainer container = new UnityContainer(); 
var something = container.Resolve<Something>(); 

साथ ही, इस एक ही तकनीक है कि प्रिज्म (CodePlex पर) का उपयोग करता है, तो आपको लगता है कि इस पर गौर करना चाहते हैं।

अद्यतन जोड़ा टेस्ट:

[TestClass] 
public class Spike 
{ 
    [TestMethod] 
    public void unityTest() 
    { 
     var container = new UnityContainer(); 
     var something= container.Resolve<Something>(); 
     Assert.AreSame(container, something.Container); 
     // This passes. Success. 
    } 
} 

public class Something 
{ 
    public Something(IUnityContainer container) 
    { 
     Container = container; 
    } 

    public IUnityContainer Container { get; set; } 
} 
+4

कंटेनर को स्वयं पंजीकृत करने की आवश्यकता नहीं है। यह डिफ़ॉल्ट रूप से IUnityContainer निर्भरता को स्वयं हल करेगा। –

+0

मेरे पास पिछली रात स्पाइक चलाने का समय नहीं था, यह इंगित करने के लिए धन्यवाद। मैंने जो परीक्षण इस्तेमाल किया वह मैंने जोड़ा। – bendewey

0

रूप bendewey के रूप में यह एक वस्तु है, किसी अन्य वस्तु की तरह आप इसे पारित कर सकते हैं, लेकिन उल्लेख किया है, यह क्यों पारित?

आपके पास केवल एक ही, क्यों नहीं तो वह एक स्थिर संपत्ति किसी भी वर्ग का उपयोग कर सकते है कि हो सकता है है?

+2

इस दृष्टिकोण के साथ मेरी चिंता यह है कि यह स्थैतिक वर्ग वाली परियोजना पर अनावश्यक निर्भरता का कारण बन सकती है। मेरे अनुभव में, कंटेनर इंजेक्शन करने से भी परीक्षण में मदद मिलती है। – bendewey

+0

इसी कारण से स्थिर निर्भरता का उपयोग अन्य निर्भरताओं के लिए नहीं किया जाता है: यह टेस्टेबिलिटी को जटिल बनाता है। –

+0

कंटेनर प्राप्त करने के लिए इकाई परीक्षण ढांचे में तर्क होने की बजाय यह बेहतर होगा, आईएमओ, कंटेनर से निपटने के लिए एक अलग वर्ग रखने के लिए, ताकि आप उस वर्ग का परीक्षण कर सकें। अब आप जानते हैं कि यह ठीक से काम करता है, इसलिए आपका यूनिट परीक्षण कुछ अनचाहे का उपयोग नहीं कर रहा है। मैं एक इकाई परीक्षण में बहुत कम उपयोगिता कार्यों का प्रयास करने की कोशिश करता हूं, क्योंकि उनको भी परीक्षण किया जाना चाहिए। –

1

पहला उत्तर है कि मैं क्या सोच रहा था की तरह है। धन्यवाद।

एकता करने से पहले, हम अपने ही आईओसी कंटेनर का निर्माण किया है, और हम एक वाक्य रचना कुछ की तरह ...

<constructor> 
    <param name="factory" value="[{factory}]"/> 
</constructor> 

[{कारखाने}] यह पैरामीटर के रूप में खुद को पारित करने के लिए कारण बनता है की है।

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

और कुछ नहीं है, तो वस्तुओं को कम से कम एक पैरामीटर के रूप में एक कंटेनर को स्वीकार करने के लिए सक्षम होना चाहिए। यदि वहां नहीं है, तो यह एक स्थिर पर वापस आ सकता है।

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

जानकारी के लिए धन्यवाद।

जे

क्षमा करें ... नए आदमी। अब मैं देखता हूं कि यह एक टिप्पणी होनी चाहिए, जवाब नहीं।

+0

इसे आपके मूल प्रश्न के अपडेट के रूप में भी phrased किया जा सकता है। यह भी ध्यान रखें, मतदान संदर्भ के बारे में "पहला जवाब" टिप्पणी ले सकता है। – bendewey

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