2009-09-03 10 views

उत्तर

65
[Fact] 
    public void CtorArgTestResolveAtGet() 
    { 
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<IWarrior>().To<Samurai>(); 
     var warrior = kernel 
      .Get<IWarrior>(new ConstructorArgument("weapon", new Sword())); 
     Assert.IsType<Sword>(warrior.Weapon); 
    } 

    [Fact] 
    public void CtorArgTestResolveAtBind() 
    { 
     IKernel kernel = new StandardKernel(); 
     kernel.Bind<IWarrior>().To<Samurai>() 
      .WithConstructorArgument("weapon", new Sword()); 
     var warrior = kernel.Get<IWarrior>(); 
     Assert.IsType<Sword>(warrior.Weapon); 
    } 
+1

क्या मैं ResolveAtGet का उपयोग कर ऑब्जेक्ट ग्राफ़ में गहराई से किसी ऑब्जेक्ट को पैरामीटर पास कर सकता हूं? – Zach

+0

गेट विधि कॉल केवल पैरामीटर को शीर्ष स्तर के आइटम को हल करने के लिए पास करते हैं। इसके अलावा, यदि आप श्रृंखला में गहन वस्तुओं को पारित पैरामीटर चाहते हैं, तो आपको बाध्यकारी में ऐसा करना होगा। –

+0

@Zach (और इयान लेकिन वह यह जानता है!) अंतर्निहित WithConstructorArgument/ConstuctorArgumetn ctor पर एक अधिभार है जो तर्क को विरासत के रूप में चिह्नित करने की अनुमति देता है जिससे उन्हें बाल संकल्पों में प्रचार करना पड़ता है जैसे मुझे लगता है कि आप चाहते हैं। (आम तौर पर इसका गलत दृष्टिकोण और एक गड़बड़ी का कारण बनता है लेकिन यह निश्चित रूप से वहां होता है) –

1

मुझे यकीन है कि अगर Ninject (मैं वर्तमान में मेरे विकास कंप्यूटर से दूर कर रहा हूँ) यह समर्थन करता है नहीं कर रहा हूँ, लेकिन अगर सब कुछ विफल हो (Ninject प्रलेखन छोड़ देता है एक बहुत वांछित होने के लिए) आप अपनी समस्या को हल करने के लिए निर्माता से प्रारंभ अलग कर सकता:

MyType obj = kernel.Get<MyType>(); 
obj.Init("foo","bar"); 
:

class MyType 
{ 
    public class MyType() {} 
    public class MyType(string param1,string param2){Init(param1,param);} 
    public void Init(string param1,param2){...} 
} 

तो फिर तुम यह कर सकते हैं

यह सही से बहुत दूर है, लेकिन ज्यादातर मामलों में नौकरी करना चाहिए।

+0

जवाब के लिए धन्यवाद, लेकिन दुर्भाग्य से मैं इस पैरामीटर के बिना मेरे वस्तु के निर्माता फोन नहीं कर सकते हैं ... Ninject 1.x, बहुत अच्छी तरह से काम करता है मैं जानना चाहूंगा कि कैसे इस सुविधा में बदल 2.0 संस्करण। – andrecarlucci

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