8

Clean Code Talks को सुनने के बाद, मुझे समझ में आया कि हमें वस्तुओं को लिखने के लिए कारखानों का उपयोग करना चाहिए। तो, उदाहरण के लिए, अगर एक House एक Door है और एक Door एक DoorKnob है, HouseFactory में हम एक नया DoorKnob बनाने और इसे Door के निर्माता को पारित, और फिर House के निर्माता के लिए है कि नए Door वस्तु गुजरती हैं।कन्स्ट्रक्टर इंजेक्शन - क्या हम कारखानों को भी इंजेक्ट करते हैं?

लेकिन क्या वर्ग House(माना वर्ग के नाम है ABC) का उपयोग करता है के बारे में? यह HouseFactory पर निर्भर करेगा, है ना? तो क्या हम ABC के निर्माता में HouseFactory पास करते हैं? क्या हमें इस तरह के निर्माता में पूरी तरह से कारखानों को पारित नहीं करना होगा?

उत्तर

9

दरवाजा और दरवाज़े उदाहरण के साथ बने रहना है, तो आप एक कारखाने इंजेक्षन नहीं है आप DooKnob खुद इंजेक्षन:

public class Door 
{ 
    private readonly DoorKnob doorKnob; 

    public Door(DoorKnob doorKnob) 
    { 
     if (doorKnob == null) 
      throw new ArgumentNullException("doorKnob"); 

     this.doorKnob = doorKnob; 
    } 
} 

कोई कारखानों इस स्तर में दृष्टि में कर रहे हैं।

हाउस, दूसरे हाथ पर, दरवाजा पर निर्भर करता है, लेकिन दरवाज़े पर नहीं:

public class House 
{ 
    private readonly Door door; 

    public House(Door door) 
    { 
     if (door == null) 
      throw new ArgumentNullException("door"); 

     this.door = door; 
    } 
} 

यह विकल्प खुला रहता है पर पिछले जब तक आप में सब कुछ रचना करने है आवेदन के Composition Root:

var house = new House(new Door(new DoorKnob())); 

आप इस स्तर पर लिखने के लिए एक डी कंटेनर का उपयोग कर सकते हैं, लेकिन आपको यह नहीं करना है। कोई कारखानों में शामिल नहीं हैं।

+0

उत्तर के लिए धन्यवाद। संरचना जड़ के बारे में एक सवाल। जब ईजेबी कॉल या वेब सेवा की बात आती है तो संरचना जड़ क्या होनी चाहिए? क्या यह स्वयं ही विधि कहा जाता है? –

+0

वे जावा विनिर्देश हैं जिनके साथ मैं परिचित नहीं हूं, लेकिन एक सामान्य अवधारणा संरचना बहुत देर हो जाती है: जब आप इसे अब तक स्थगित नहीं कर सकते हैं। –

1

यदि आप बहुत सारी फैक्ट्रियों को इंजेक्ट करते हैं जो constructor over-injection नामक एक कोड गंध है जो इंगित करता है कि आपकी कक्षा बहुत अधिक कर रही है।

कई कंटेनर ऑटो-फैक्ट्रियों नामक एक सुविधा प्रदान करते हैं। इसका मतलब है कि वे उत्पन्न करने के बारे में जानते हैं, तो वे Func<T> प्रकार की कारखानों को स्वचालित रूप से उत्पन्न करते हैं।

कैसल विंडसर में Typed Factory facilities नामक एक उन्नत सुविधा है जो फ़ैक्टरी इंटरफ़ेस पर फ़ैक्टरी इंटरफ़ेस को कार्यान्वित करती है।

TecX project में एकता के लिए टाइप की गई कारखानों का एक बंदरगाह भी है। -

0

यदि आप एकता का उपयोग करते हैं, तो मैंने हाल ही में एकता के लिए कैसल विंडसर टाइपेड फैक्ट्रियों के बराबर लागू किया है। आप प्रोजेक्ट को https://github.com/PombeirP/Unity.TypedFactories पर और http://nuget.org/packages/Unity.TypedFactories पर NuGet पैकेज पर पा सकते हैं।

उपयोग है निम्नलिखित:

unityContainer 
    .RegisterTypedFactory<IFooFactory>() 
    .ForConcreteType<Foo>(); 

तुम बस IFoo लौटने एक विधि के साथ IFooFactory इंटरफेस बनाने के लिए, और बाकी पुस्तकालय द्वारा आप के लिए किया जाता है। आप IFooFactory को हल कर सकते हैं और IFoo ऑब्जेक्ट्स को तुरंत बनाने के लिए इसका उपयोग कर सकते हैं।