2011-08-09 9 views
6

मैं कुछ वस्तुओं को तुरंत चालू करने के लिए एकता का उपयोग कर रहा हूं और मुझे लगता है कि इससे कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, एकता मेरी वस्तुओं के लिए सिंगलेट बना रही है।यूनिटी, रजिस्टर टाइप <> और सिंगलटन ऑब्जेक्ट्स

प्रलेखन के अनुसार: http://msdn.microsoft.com/en-us/library/dd203242.aspx#Y500

निम्नलिखित कोड मैं एक अलग उदाहरण हर बार इंटरफ़ेस का समाधान हो जाता है हो रही किया जाना चाहिए के साथ

IUnityContainer myContainer = new UnityContainer(); 

// Register a default (un-named) type mapping with a transient lifetime 
myContainer.RegisterType<IMyObject, MyRealObject>(); 
// Following code will return a new instance of MyRealObject 
myContainer.Resolve<IMyObject>(); 

लेकिन इसके बजाय मुझे सिंगलटन उदाहरण मिल रहा है।

नीचे मेरी घोषणा है। Global.asax

// This should get me a singleton 
container.RegisterType<IRetailerService, RetailerService>(new ContainerControlledLifetimeManager(), new InjectionConstructor()); 
// This is the one giving me trouble. 
container.RegisterType<IInStoreRetailersViewModelBuilder, InStoreRetailersViewModelBuilder>(new InjectionConstructor(container.Resolve<IRetailerService>())); 
container.RegisterType<CollectController>(new InjectionConstructor(container.Resolve<IInStoreRetailersViewModelBuilder>())); 

नियंत्रक

private readonly IInStoreRetailersViewModelBuilder _inStoreRetailersViewModelBuilder; 

public CollectController(IInStoreRetailersViewModelBuilder inStoreRetailersViewModelBuilder) 
{ 
    this._inStoreRetailersViewModelBuilder = inStoreRetailersViewModelBuilder; 
} 

public ActionResult Index() 
{ 
    InStoreViewModel viewModel = this._inStoreRetailersViewModelBuilder.WithRetailers().WithPostcode().Build(); 
} 

अगर मैं Chrome को खोलने और सूचकांक कार्रवाई चलाने के लिए, और फिर मैं जाकर खुला इंटरनेट एक्सप्लोरर और, सूचकांक कार्रवाई फोन दूसरी कॉल पर , कन्स्ट्रक्टर में inStoreRetailersViewModelBuilder पैरामीटर जो इंजेक्शन प्राप्त करता है वह पहला कॉल (क्रोम के साथ) पर जेनरेट किया जाता है।

मैं इस धागे से PerResolveLifetimeManager() और यहां तक ​​कि PerHttpRequestLifetime() का उपयोग कर की कोशिश की है: MVC, EF - DataContext singleton instance Per-Web-Request in Unity

लेकिन कुछ भी नहीं मुझे एक नया उदाहरण देने के लिए लगता है। कोई भी इस बारे में कुछ प्रकाश डाल सकता है कि मैं यहां क्या गलत कर रहा हूं?

उत्तर

9

इसे आज़माएं और देखें कि यह मदद करता है या नहीं।

container.RegisterType<IInStoreRetailersViewModelBuilder, InStoreRetailersViewModelBuilder>(
new InjectionConstructor(
    new ResolvedParameter<IRetailerService>())); 
container.RegisterType<CollectController>(
new InjectionConstructor(
    new ResolvedParameter<IInStoreRetailersViewModelBuilder>())); 

हो सकता है कि अपने आप को अपने निर्माता के लिए पैरामीटर को हल करने से आप अनिवार्य रूप से एक विशिष्ट उदाहरण है, जिसमें यह एक सिंगलटन किया जा रहा में परिणाम में गुजर रहे हैं।

+0

यह काम करता है! कंटेनर का उपयोग करने के बीच क्या अंतर है। रिसोलव और नया संकल्प पैरामीटर? मैं एकता पर एक विशेषज्ञ नहीं हूं और हालांकि अधिकांश भाग के लिए यह बहुत अच्छा काम करता है, कभी-कभी यह मेरे सिर को खरोंच कर रहा है। सहायता के लिए धन्यवाद! – Yag

+3

मुझे लगता है कि अंतर यह है कि कंटेनर का उपयोग करके। रिसेल्व आप किसी मौजूदा ऑब्जेक्ट में कन्स्ट्रक्टर को पास कर रहे हैं, इसलिए यह हमेशा उस मौजूदा ऑब्जेक्ट का उपयोग करेगा। जब आप ResolvedParameter Unity का उपयोग करते हैं तो हर बार एक नई ऑब्जेक्ट को हल करेगा और इसे कन्स्ट्रक्टर को पास कर देगा। आपके द्वारा लिंक किए गए दस्तावेज़ों पर नज़र डालें, मुझे लगता है कि रजिस्टरइंस्टेंस विधि अनुभाग के साथ लाइफटाइम मैनेजर का उपयोग करने का पहला उदाहरण आप जो कर रहे थे उसके बराबर है। – MLF

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