2014-09-04 3 views
12

के साथ कई तर्कों के साथ कन्स्ट्रक्टर IoC कंटेनर के रूप में Ninject का उपयोग करने की कोशिश कर रहा हूं लेकिन यह समझ में नहीं आया कि एक वर्ग का उदाहरण कैसे बनाया जाए जिसमें कन्स्ट्रक्टर में 1 से अधिक पैरामीटर हैं।निनजेक्ट

//On PCL project 
public interface IAuthorizationService { 
bool Authenticate(); 
} 

//On WP8 Project 
pubilc class MyAuthenticator : IAuthorizationService { 
public MyAuthenticator(string consumerKey, string consumerSecret, string baseAddress) { ... } 
public bool Authenticate() { ... } 
} 

अब मैं Ninject मॉड्यूल कॉन्फ़िगर करने के लिए तो मैं प्राप्त कर सकते हैं की जरूरत है: मूल रूप से मैं एक पीसीएल पुस्तकालय में प्रमाणीकरण के लिए एक सेवा इंटरफेस और एक WP8 परियोजना है कि निर्माता में प्राप्त करता है Cosumer कुंजी, गुप्त और baseAddress में इसके कार्यान्वयन है IAuthorizationService का एक उदाहरण। तो मेरी कक्षा कोई कंस्ट्रक्टर्स था मुझे क्या करना होगा:

internal class Module : NinjectModule { 
public override void Load() { 
    this.Bind<IAuthorizationService>().To<MyAuthenticator>(); 
} 
} 

यदि यह निर्माता के लिए मूल्यों तय किया था मुझे क्या करना होगा:

internal class Module : NinjectModule { 
public override void Load() { 
    this.Bind<IAuthorizationService>().To<MyAuthenticator>().WithConstructorArgument(*/* fixed argument here*/*); 
} 
} 

और Module.Get<IAuthorizationService>()

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

प्रश्न को क्लैरीफ़ी संपादित करने के लिए संपादित किया गया।

+0

डाउनवोट क्यों? कम से कम टिप्पणी की जानी चाहिए ताकि मैं सवाल बदल सकूं ... –

+0

शायद ऐसा इसलिए है क्योंकि उन्हें लगा कि दस्तावेज़ों को देखकर इस प्रश्न का आसानी से उत्तर दिया जा सकता है: https://github.com/ninject/ninject/wiki/Dependency-Injection- निनजा – BatteryBackupUnit

+0

नहीं, यह नहीं है! यदि आप दस्तावेज़ों को देखते हैं तो सभी कन्स्ट्रक्टर पैरामीटर भी "इंजेक्शन योग्य" होते हैं। मेरे कन्स्ट्रक्टर स्ट्रिंग पैरामीटर है। –

उत्तर

10

यह बहुत आसान है। कोई फर्क नहीं पड़ता कि कितने निर्माता तर्क, बंधन रहता है एक ही:

Bind<IAuthorizationService>().To<MyAuthenticator>(); 

मान लीजिए कि MyAuthenticator प्रकार IFoo में से एक पैरामीटर के साथ एक निर्माता था करते हैं। आपको बस इतना करना है कि यह IFoo को हल/कैसे बना सकता है। फिर से, बहुत ही सरल:

Bind<IFoo>().To<Foo>(); 

आप मामले में WithConstructorArgument कभी, की जरूरत नहीं है छोड़कर आप Ninject के डिफ़ॉल्ट व्यवहार को ओवरराइड करना चाहते हैं। मान लें कि MyAuthenticator में IFoo और अन्य पैरामीटर string seed का पैरामीटर है जिसे आप विशेष रूप से कॉन्फ़िगर करना चाहते हैं। आप सभी की जरूरत होता है:

Bind<IFoo>().To<Foo>(); 
Bind<IAuthorizationService>().To<MyAuthenticator>() 
    .WithConstructorArgument("seed", "initialSeedValue"); 

IFoo पैरामीटर का मान निर्दिष्ट करने के लिए कोई जरूरत नहीं!

+1

यह समस्या है, मेरे कन्स्ट्रक्टर में स्ट्रिंग पैरामीटर हैं और मुझे बाइंड टाइम पर उनका मूल्य नहीं पता है। –

+0

आप स्ट्रिंग पैरामीटर के मान कहां से प्राप्त करते हैं? मुझे लगता है कि आपको कारखाने की आवश्यकता हो सकती है। आप इन स्ट्रिंग पैरामीटर को 'प्रमाणीकरण()' विधि के तर्क के रूप में क्यों नहीं पारित करते हैं? – BatteryBackupUnit

+0

2 में से 2 कॉन्फ़िगरेशन फ़ाइलों से हैं इसलिए मैंने 'विथ कॉन्स्ट्रक्टर आर्ग्यूमेंट()' विधि के साथ पास किया। दूसरा उपयोगकर्ता इनपुट पर निर्भर करता है। –

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