2010-01-30 10 views
18

मैं इस WCF विधिWCF निर्भरता इंजेक्शन और अमूर्त कारखाने

Profile GetProfileInfo(string profileType, string profileName) 

और व्यापार नियम है।

यदि प्रोफ़ाइल टाइप xml फ़ाइल से "बी" पढ़ा जाता है।

सवाल यह है कि: एक निर्भरता इंजेक्शन कंटेनर का उपयोग करके इसे कैसे कार्यान्वित किया जाए?

उत्तर

22

चलो पहले मान आप इस तरह एक IProfileRepository कुछ है कि:

public interface IProfileRepository 
{ 
    Profile GetProfile(string profileName); 
} 

साथ ही दो कार्यान्वयन: DatabaseProfileRepository और XmlProfileRepository। मुद्दा यह है कि आप प्रोफाइल टाइप के मूल्य के आधार पर सही एक चुनना चाहते हैं।

आप इस सार फैक्टरी शुरू करने से यह कर सकते हैं:

public Profile GetProfileInfo(string profileType, string profileName) 
{ 
    return this.factory.Create(profileType).GetProfile(profileName); 
} 
:

public interface IProfileRepositoryFactory 
{ 
    IProfileRepository Create(string profileType); 
} 

यह मानते हुए कि IProfileRepositoryFactory सेवा कार्यान्वयन में इंजेक्ट कर दिया गया है, अब आप इस तरह GetProfileInfo विधि लागू कर सकते हैं

IProfileRepositoryFactory का एक ठोस कार्यान्वयन इस तरह दिख सकता है:

public class ProfileRepositoryFactory : IProfileRepositoryFactory 
{ 
    private readonly IProfileRepository aRepository; 
    private readonly IProfileRepository bRepository; 

    public ProfileRepositoryFactory(IProfileRepository aRepository, 
     IProfileRepository bRepository) 
    { 
     if(aRepository == null) 
     { 
      throw new ArgumentNullException("aRepository"); 
     } 
     if(bRepository == null) 
     { 
      throw new ArgumentNullException("bRepository"); 
     } 

     this.aRepository = aRepository; 
     this.bRepository = bRepository; 
    } 

    public IProfileRepository Create(string profileType) 
    { 
     if(profileType == "A") 
     { 
      return this.aRepository; 
     } 
     if(profileType == "B") 
     { 
      return this.bRepository; 
     } 

     // and so on... 
    } 
} 

अब तुम सिर्फ यह सब तार की आप के लिए अपनी पसंद के डि कंटेनर प्राप्त करने की आवश्यकता ...

+0

उन अनुक्रमिक 'ifs' को प्रतिस्थापित किया जा सकता है एक तेज़/अधिक सुस्पष्ट 'स्विच/केस'। और 'प्रोफाइल टाइप' वास्तव में एक गणित होना चाहिए, एक मनमानी स्ट्रिंग नहीं। इसके अलावा यह एक अच्छा जवाब है। :) – Aaronaught

+3

हां, वहां कोई असहमति नहीं है, लेकिन मैं ओपी द्वारा दिए गए एपीआई के साथ गया :) –

+0

अगर मैं संकलन समय की संख्या संकलित करने के समय में नहीं जानता तो यह किस तरह से बदल सकता है? और यदि मेरे डब्ल्यूसीएफ में लॉग लाइब्रेरी और इन रिपॉजिटरीज़ के साथ केवल निर्भरता है, तो सबसे अच्छा DI कंटेनर विकल्प कहां है? एमईएफ इस परिदृश्य में एक अच्छा choiche है? – tartafe

4

मार्क द्वारा महान जवाब है, हालांकि समाधान नहीं दिया सार कारखाने लेकिन स्टैंडर्ड के कार्यान्वयन है फैक्टरी पैटर्न। कृपया मानक फैक्टरी पैटर्न यूएमएल आरेख में मार्क वर्ग कैसे फिट बैठते हैं, इसकी जांच करें। Click here to see above classes applied to Factory pattern UML

फैक्टरी पैटर्न में, कारखाने ठोस वर्गों से अवगत है, हम ProfileRepositoryFactory का कोड नीचे की तरह सरल बना सकते हैं। कारखाने के लिए विभिन्न भंडारों को इंजेक्शन देने में समस्या यह है कि जब भी आप एक नया ठोस प्रकार जोड़ते हैं तो आपके पास अधिक कोड परिवर्तन होते हैं। नीचे दिए गए कोड के साथ आप केवल स्विच अद्यतन करने के लिए नई ठोस वर्ग में शामिल करने के लिए है

 

    public class ProfileRepositoryFactory : IProfileRepositoryFactory 
    { 
     public IProfileRepository Create(string profileType) 
     { 
      switch(profileType) 
      { 
       case "A": 
        return new DatabaseProfileRepository(); 

       case "B": 
        return new XmlProfileRepository(); 
      } 
     } 
    } 
 

सार फैक्टरी अधिक उन्नत उनके ठोस वर्ग निर्धारित किए बिना ही संबंधित या निर्भर वस्तुओं के परिवारों बनाने के लिए इस्तेमाल किया पैटर्न है। यूएमएल कक्षा आरेख उपलब्ध here इसे अच्छी तरह से बताता है।