2010-03-23 50 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。普遍的共識似乎是,添加默認構造函數可能會造成不必要的混淆,儘管有些人認爲當不使用依賴注入框架的調用者使用庫時它是值得的。 – 2010-03-24 00:19:12

+0

感謝您的鏈接。在我的情況下,我正在編寫一個獨立的應用程序,而不是一個庫。依賴注入框架是另一個從我現在的位置開始的曲折的學習階梯,但我應該調查一下。 – Grokodile 2010-03-24 00:40:16

回答

3

包括一個默認的構造函數是一種代碼異味,因爲現在該類被耦合到IDirectoryInfoWrap的具體實現。爲了使您的生活更輕鬆,請使用該類外部的IOC容器來注入不同的依賴項,具體取決於您是在運行測試代碼還是主流應用程序。

+1

http://martinfowler.com/bliki/InversionOfControl.html添加到我的閱讀列表中,謝謝。 – Grokodile 2010-03-24 00:43:00

0

這幾乎是我要做的事。

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

    public MyUnitTestableClass() 
     : this(new DefaultImplementation()) 
    { 
    } 
} 
相關問題