2012-01-03 17 views
6

में एक प्रदाता का उपयोग कैसे करें मैं कोडNinject

public class Something { 
    [Inject] 
    public Configuration config {get;set;} //singleton 
    [Inject] 
    public Provider<WindowHandler> windowsProvider { get; set; } //NOT singleton 

    public void Search(string text) { 
     WindowHandler handler = windowsProvider.Create(xxxxxx); 
     //use the new handler that was created 
    } 
} 

निम्नलिखित है लेकिन ऐसा लगता है प्रदाता एक iConText जहाँ मैं xxxxxx डाल लेता है। जब मैंने बूटस्ट्रैप किया और बनाया तो आईसीएन्टेक्स्ट को कर्नेल से Something.cs का उपयोग नहीं किया जाना चाहिए। कोई पैरामीटर प्रदाता पर विधि बनाएँ विधि ??? (मैं गुइस भूमि के दृष्टिकोण से आ रहा हूं जहां इसे ऊपर की तरह कोड किया जाएगा)।

तो सवाल यह है कि मैं इसे सही तरीके से कैसे करूं?

धन्यवाद, डीन

उत्तर

12

यह आप अपने कोड में एक कारखाने के रूप में एक सेवा का इस्तेमाल करने की कोशिश कर रहे हैं।

निनजेक्ट शर्तों में एक प्रदाता एक कारखाना है जो विशेष रूप से निर्मित वस्तुओं को बनाने के लिए निनजेक्ट को दिया जाता है। इसलिए यह हल करने वाले संदर्भ को प्राप्त करता है जिसका प्रयोग विभिन्न उदाहरणों को बनाने के लिए किया जा सकता है, जहां पर इंजेक्शन दिया गया था।

public class FooProvider : Provider<IFoo> 
{ 
    public override IFoo CreateInstance(IContext ctx) 
    { 
     // add here your special IFoo creation code 
     return new Foo(); 
    } 
} 

kernel.Bind<IFoo>().ToProvider<FooProvider>(); 

क्या आप चाहते हैं कि आपके सांकेतिक शब्दों में बदलनेवाला में एक कारखाना है कि WindowHandler का एक उदाहरण बनाता है। इसलिए इस तरह उदाहरण बनाने के लिए एक इंटरफेस बनाने के लिए:

public interface IWindowHandlerFactory 
{ 
    WindowHandler Create(); 
} 

Bind<IWindowHandlerFactory>().ToFactory(); 

वैकल्पिक रूप से आप एक विन्यास जोड़े बिना Func<WindowHandler> इंजेक्षन कर सकते हैं। लेकिन यह मेरी राय में कम अर्थपूर्ण है।

नोट: इन सभी को Ninject.Extensions.Factory को Nuget से prerelease 3.0.0-rc2 के रूप में उपलब्ध है।

यह भी देखें: http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/

+0

Func वही है जो मैं ढूंढ रहा था। क्या 2.0 में ऐसा करने का कोई तरीका नहीं है, जिस संस्करण पर हम हैं? –

+1

देखें http://stackoverflow.com/questions/4840157/does-ninject-support-func-auto-generated-factory/4851885#4851885 –

1

खैर, मेरी अंतिम समाधान Ninject 2.0 निम्न कोड के साथ में धोखा देने के लिए ...

 var windowFactory = kernel.Get<IEWindowFactory>(); 
     var tabFactory = kernel.Get<IETabFactory>(); 
     windowFactory.Kernel = kernel; 
     tabFactory.Kernel = kernel; 

और बाइंडिंग सूची में मैं

Bind<IEWindowFactory>().ToSelf().InSingletonScope(); 
Bind<IETabFactory>().ToSelf().InSingletonScope(); 
है था

और उसके बाद मैं बस अपना ऐप

var main = kernel.Get<MainForm>(); 
main.Start(); 

और निश्चित रूप से कारखानों को इंजेक्शन दिया जाता है जहां मुझे उन मेनफॉर्म के उत्तराधिकारी में उनकी आवश्यकता होती है।

इसलिए जब मैं शुरू होता हूं तो मैन्युअल रूप से कर्नेल डालता हूं और फिर जब मैं अपने ऐप को बूटस्ट्रैप करता हूं, तो स्वाभाविक रूप से ये कारखानियां [निनजेक्ट] एनोटेशन के साथ कक्षाओं में फ़ील्ड होती हैं और इसलिए वे ऑब्जेक्ट्स बना सकते हैं। जब तक हम 3.0 प्राप्त नहीं करते, तब तक सबसे साफ नहीं है, लेकिन यह काम करता है (और मुझे अतिरिक्त फैक्ट्री कक्षाओं से नफरत है जो मुझे कोड लिखना है लेकिन ओह ठीक है)।

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