2012-07-26 10 views
7

मैं निम्नलिखित श्रेणियां होती हैं:Ninject कई इंजेक्शन इंटरफेस के बंधन

using System; 

interface IA { } 

class A1 : IA { } 

class A2 : IA { } 

class B 
{ 
    public B(IA a) {} 
} 

class BProvider : Provider<B> 
{ 
    IA _a; 

    public BProvider(IA a) { _a=a; } 

    protected override B CreateInstance(IContext context) { return new B(_a); } 
} 

Ninject मॉड्यूल लोड() कोड:

Bind<IA>().To<A1>(); 
Bind<IA>().To<A2>(); 
Bind<B>().ToProvider<BProvider>(); 

मुख्य कोड:

kernel.GetAll<IA>(); // works fine 
kernel.GetAll<B>(); // I expect to get IEnumerable<B> with two elements, but instead of this I get an error that there are multiple bindings of IA and ninject cannot determine which to use 

तो सवाल यह है अगर मैं अंतिम कथन को उम्मीद के रूप में काम कर सकता हूं या इसे किसी अन्य तरीके से कर सकता हूं?

उत्तर

2

यह उस अपवाद को फेंक देगा क्योंकि निनजेक्ट को BProvider प्रकार की वस्तु का उदाहरण बनाने की आवश्यकता होगी। ऐसा करने के लिए, इसे IA पर निर्भरता भरनी होगी। लेकिन पल ... IA पर दो बाइंडिंग हैं, जिन्हें मुझे चुनना चाहिए? ....

आप कुछ सशर्त बाध्यकारी का उपयोग यह तय करने के लिए कर सकते हैं कि कौन सा कार्यान्वयन किया जाना चाहिए। एक तरह से NamedAttribute साथ है:

Bind<IA>().To<A1>(); 
Bind<IA>().To<A2>().Named("SecondImpl"); 
Bind<B>().ToProvider<BProvider>(); 


class BProvider : Provider<B> 
{ 
    IA _a; 

    public BProvider([Named("SecondImpl")]IA a) { _a=a; } 

    protected override B CreateInstance(IContext context) { return new B(_a); } 
} 

इस मामले A1 डिफ़ॉल्ट जहां NamedAttribute निर्दिष्ट नहीं है के रूप में इंजेक्ट किया जा होगा। , Configuring Ninject

Bind<IA>().To<A1>(); 
Bind<IA>().To<A2>().WhenParentNamed("NeedSecondImpl"); 
Bind<B>().ToProvider<BProvider>().Named("NeedSecondImpl"); 

यह थोड़ा क्लीनर है, क्योंकि आप न Ninject के लिए अपने कोड टाई करने के लिए है और सिर्फ विन्यास पर यह कर सकते हैं (एक ही स्थान पर):

या @Remo GLOOR की तरह इस पोस्ट में बताते हैं।

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