32

मैं निम्नलिखित (सरलीकृत) स्थिति है: मैं दो इंटरफेसयह एक वर्ग उन सभी को लागू करने का एक ही उदाहरण के लिए अलग इंटरफेस बाध्य करने के लिए संभव है?

interface IAmAnInterface 
{ 
    void DoSomething(); 
} 

और

interface IAmAnInterfaceToo 
{ 
    void DoSomethingElse(); 
} 

और एक वर्ग दोनों को लागू करने:

class IAmAnImplementation: IAmAnInterface, IAmAnInterfaceToo 
{ 
    public IAmAnImplementation() 
    { 
    } 

    public void DoSomething() 
    { 
    } 

    public void DoSomethingElse() 
    { 
    } 
} 

अब मैं करने के लिए एक ही कक्षा के लिए बाध्य Ninject का उपयोग कर दोनों इंटरफेस। जब से मैं एक ही उदाहरण चाहते IAmAnImplementation कीIAmAnInterface के लिए इस्तेमाल किया beeing रूप में अच्छी तरह IAmAnInterfaceToo के रूप में यह स्पष्ट है मैं सिंगलटन किसी तरह की आवश्यकता है। मैं InScope() के साथ ही ninject.extensions.namedscope के साथ चारों ओर खेला लेकिन कोई सफलता मिली। मेरे पिछले कोशिश थी:

Bind<IAmAnImplementation>().ToSelf().InSingletonScope(); 
Bind<IAmAnInterface>().To<IAmAnImplementation>().InSingletonScope(); 
Bind<IAmAnInterfaceToo>().To<IAmAnImplementation>().InSingletonScope(); 

लेकिन दुर्भाग्य से जब मैं वास्तव में kernel.Get<IDependOnBothInterfaces>(); के माध्यम से अपने परीक्षण वर्ग का एक उदाहरण का अनुरोध यह IAmAnImplementation के विभिन्न उदाहरणों का उपयोग करता है।

class IDependOnBothInterfaces 
{ 
    private IAmAnInterface Dependency1 { get; set; } 
    private IAmAnInterfaceToo Dependency2 { get; set; } 

    public IDependOnBothInterfaces(IAmAnInterface i1, IAmAnInterfaceToo i2) 
    { 
     Dependency1 = i1; 
     Dependency2 = i2; 
    } 

    public bool IUseTheSameInstances 
    { 
     get { return Dependency1 == Dependency2; } // returns false 
    } 
} 

वहाँ एक रास्ता Ninject बता IAmAnInterface के साथ-साथ IAmAnInterfaceToo के लिए IAmAnImplementation का एक ही उदाहरण का उपयोग करने के है?

+0

संबंधित: [इस V2 युग सवाल] देखें (http://stackoverflow.com/questions/3147996/binding-singleton-to-multiple-services -इन-Ninject) वर्ष अमान्य का अत्यधिक विस्तृत विचार विमर्श के लिए –

उत्तर

88

यह v3.0.0 का उपयोग कर बहुत आसान है

Bind<I1, I2, I3>().To<Impl>().InSingletonScope(); 
+0

+1 दृष्टिकोण मैं 3.0 :) बहुत पता करने के लिए अच्छा में इस के बारे में पता नहीं था। –

+0

+1 धन्यवाद। असल में मैं 3.0 का उपयोग कर रहा हूं इसलिए मैं इस समाधान के लिए जाऊंगा। – Silas

+6

यदि आपके पास 4 से अधिक इंटरफेस हैं: 'बाइंड (आई 1, आई 2, आई 3, आई 4, आई 5)। () .इंसेलेटनस्कोप(); ' – Jerome

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

  • कोई संबंधित समस्या नहीं^_^