2011-11-02 11 views
11

के साथ एक ही प्रकार के एकाधिक कन्स्ट्रक्टर पैरामीटर इंजेक्शन करना मैं अपने ऐप्स में से एक में DI को संभालने के लिए निनजेक्ट 2.0 का उपयोग कर रहा हूं और मैं कुछ ऐसा कर रहा हूं जो मुझे भ्रमित कर रहा है। शून्य दस्तावेज़ीकरण होने से ईमानदार होने में बहुत मदद नहीं मिलती है।निनजेक 2.0

ctor(IServiceFactory factory1, IServiceFactory factory2) 
{ 
    this.factory1 = factory1; 
    this.factory2 = factory2; 
} 

हालांकि इन दो सेवाओं को एक ही इंटरफ़ेस को लागू है, वे काफी अलग कार्यान्वयन हैं और अलग अलग समय पर उपयोग किया जाता है तो मैं एक IEnumerable<IServiceFactory> इंजेक्षन नहीं करना चाहते -

मैं हस्ताक्षर के साथ एक निर्माता है कहो ।

मेरा सवाल यह है कि, जब मैं उदाहरणों को बाध्य कर रहा हूं, तो मैं निनजेक्ट को कैसे बता सकता हूं कि प्रत्येक के लिए इंजेक्ट करना क्या है?

अग्रिम धन्यवाद।

अद्यतन

कोड को देखने के लिए इच्छुक किसी की खातिर Remo के लिंक को पढ़ने के बाद खत्म हो जाएगा के लिए, ... यहाँ यह संक्षिप्त में है। (मैं कभी नहीं महसूस किया सी # पैरामीटर गुण था!) ​​

//abstract factory 
public interface IServiceFactory 
{ 
    Service Create(); 
} 

//concrete factories 
public class Service1Factory : IServiceFactory 
{ 
    public IService Create() 
    { 
     return new Service1(); 
    } 
} 

public class Service2Factory : IServiceFactory 
{ 
    public IService Create() 
    { 
     return new Service2(); 
    } 
} 

//Binding Module (in composition root) 
public class ServiceFactoryModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IServiceFactory>() 
      .To<Service1Factory>() 
      .Named("Service1"); 

     Bind<IServiceFactory>() 
      .To<Service2Factory>() 
      .Named("Service2"); 
    } 
} 

//consumer of bindings 
public class Consumer(
    [Named("Service1")] service1Factory, 
    [Named("Service2")] service2Factory) 
{ 
} 

उत्तर

10

सब आप अपने आप को पूछने के लिए अगर कार्यान्वयन एक पूरी तरह से अलग कुछ करने की आवश्यकता है, तो एक ही इंटरफ़ेस का उपयोग कर सही है पहले। आम तौर पर, इंटरफेस उपभोक्ता और कार्यान्वयन के बीच अनुबंध है। तो यदि उपभोक्ता विभिन्न चीजों की अपेक्षा करता है तो आप विभिन्न इंटरफेस को परिभाषित करने पर विचार कर सकते हैं।

यदि आप सशर्त बाइंडिंग का उपयोग करने के बजाय एक ही इंटरफ़ेस के साथ रहने का निर्णय लेते हैं।

https://github.com/ninject/ninject/wiki/Contextual-Binding

https://github.com/ninject/ninject/wiki/Conventions-Based-Binding

+0

धन्यवाद Remo: यह कैसे किया जाता के बारे में दस्तावेज़ देखें। वे वास्तव में एक अमूर्त कारखाने के विभिन्न कार्यान्वयन हैं जो यूआई में टैब बनाते हैं ताकि वे वही काम कर सकें ... केवल विभिन्न कारणों से। – Stimul8d

+1

मुझे लगता है कि आप सही ढंग से समझ में नहीं आया। उपभोक्ता के बिंदु से वे एक ही बात नहीं करते हैं। इंटरफ़ेस को उपभोक्ता के परिप्रेक्ष्य से परिभाषित किया जाना चाहिए। जैसे यदि आपके पास फैक्ट्री इंटरफ़ेस 'फलों CreateFruit() 'है और उपभोक्ता को दो कार्यान्वयन की उम्मीद है कि केले के लिए एक और संतरे के लिए एक तो आपको इंटरफ़ेस को' केला बनाएंबाना() 'और' ऑरेंज CreateOrange() 'के रूप में परिभाषित करना चाहिए, भले ही आपको आवश्यकता हो उन्हें केवल फल के रूप में। –

+0

मैं देखता हूं। आप सुझाव दे रहे हैं कि मैं कंक्रीट फैक्ट्री कक्षाओं के साथ एक अमूर्त कारखाने के बजाय कारखाने के तरीकों का उपयोग करता हूं। यह एक विकल्प है लेकिन फैक्ट्री कक्षाओं में स्वयं निर्भरताएं हैं (इस मामले में उप-स्क्रीन) जिन्हें इंजेक्शन देने की आवश्यकता है। कारखाने के तरीकों के बजाय कंक्रीट कारखानों और कन्स्ट्रक्टर इंजेक्शन के साथ उन निर्भरताओं को हल करना बहुत आसान है, न कि उनके पास कुछ अन्य जादू है जो मुझे याद आ रही है? – Stimul8d