2010-03-23 3 views
6

मेरे वर्ग रचनाकारों को चेन करने के लिए मेरी प्रेरणा यहां है कि मेरे पास मेरे आवेदन द्वारा मुख्यधारा के उपयोग के लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर है और दूसरा जो मुझे नकली और स्टब इंजेक्ट करने की अनुमति देता है।क्या यह कन्स्ट्रक्टर चेनिंग का उपयोग करने का एक अच्छा या बुरा तरीका है? (... परीक्षण के लिए अनुमति देने के लिए)

यह सिर्फ कुछ बदसूरत 'नई' चीजों में लगता है ": यह (...)" कॉल और काउंटर-इंट्यूविट एक डिफ़ॉल्ट कन्स्ट्रक्टर से एक पैरामीट्रिज्ड कन्स्ट्रक्टर को बुला रहा है, मुझे आश्चर्य हुआ कि अन्य लोग यहां क्या करेंगे?

(FYI ->SystemWrapper)

using SystemWrapper; 

public class MyDirectoryWorker{ 

    // SystemWrapper interface allows for stub of sealed .Net class. 
    private IDirectoryInfoWrap dirInf; 

    private FileSystemWatcher watcher; 

    public MyDirectoryWorker() 
     : this(
     new DirectoryInfoWrap(new DirectoryInfo(MyDirPath)), 
     new FileSystemWatcher()) { } 


    public MyDirectoryWorker(IDirectoryInfoWrap dirInf, FileSystemWatcher watcher) 
    { 
     this.dirInf = dirInf; 
     if(!dirInf.Exists){ 
      dirInf.Create(); 
     } 

     this.watcher = watcher; 

     watcher.Path = dirInf.FullName; 

     watcher.NotifyFilter = NotifyFilters.FileName; 
     watcher.Created += new FileSystemEventHandler(watcher_Created); 
     watcher.Deleted += new FileSystemEventHandler(watcher_Deleted); 
     watcher.Renamed += new RenamedEventHandler(watcher_Renamed); 
     watcher.EnableRaisingEvents = true; 
    } 

    public static string MyDirPath{get{return Settings.Default.MyDefaultDirPath;}} 

    // etc... 
} 
+1

एसओ पर इस बारे में काफी चर्चा हुई है। उदाहरण के लिए, http://stackoverflow.com/questions/300286/constructor-injection-and-default-overloads देखें। आम सहमति यह प्रतीत होती है कि डिफ़ॉल्ट कन्स्ट्रक्टर जोड़ना अनावश्यक रूप से भ्रमित हो सकता है, हालांकि कुछ तर्क देते हैं कि जब आपकी लाइब्रेरी उन कॉलर्स द्वारा उपयोग की जाती है जो निर्भरता इंजेक्शन ढांचे का उपयोग नहीं करते हैं तो यह इसके लायक है। –

+0

लिंक के लिए धन्यवाद। मेरे मामले में मैं पुस्तकालय की बजाय एक स्टैंडअलोन आवेदन लिख रहा हूं। निर्भरता इंजेक्शन ढांचे एक और घुमावदार सीखने की सीढ़ी है जहां से मैं अब हूं लेकिन मुझे कुछ जांच करनी चाहिए। – Grokodile

उत्तर

3

एक डिफ़ॉल्ट निर्माता सहित एक कोड गंध के रूप में अब कक्षा IDirectoryInfoWrap के ठोस कार्यान्वयन के लिए युग्मित है है। अपने जीवन को आसान बनाने के लिए, आप परीक्षण कोड या मुख्यधारा के आवेदन चला रहे हैं या नहीं, इस पर निर्भर करते हुए विभिन्न निर्भरताओं को इंजेक्ट करने के लिए कक्षा में बाहरी आईओसी कंटेनर का उपयोग करें।

+1

http://martinfowler.com/bliki/InversionOfControl.html मेरी रीडिंग सूची में जोड़ा गया, धन्यवाद। – Grokodile

0

कि काफी मैं इसे कैसे करते हैं।

class MyUnitTestableClass 
{ 
    public MyUnitTestableClass(IMockable foo) 
    { 
     // do stuff 
    } 

    public MyUnitTestableClass() 
     : this(new DefaultImplementation()) 
    { 
    } 
} 
संबंधित मुद्दे

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