2010-03-23 31 views
6

Động lực của tôi cho việc xây dựng các lớp của tôi ở đây là để tôi có một hàm tạo mặc định để sử dụng chính bởi ứng dụng của tôi và thứ hai cho phép tôi tiêm một mô hình và một nhánh.Đây có phải là cách tốt hay xấu để sử dụng chuỗi hàm tạo không? (... để cho phép thử nghiệm)

Có vẻ như một thứ xấu xí mới trong cuộc gọi ": this (...)" và phản trực giác gọi một nhà xây dựng có tham số từ một nhà xây dựng mặc định, tôi tự hỏi những người khác sẽ làm gì ở đây?

(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

Có một số lượng thảo luận hợp lý về điều này trên SO. Ví dụ: xem http://stackoverflow.com/questions/300286/constructor-injection-and-default-overloads. Sự đồng thuận chung dường như là việc thêm hàm tạo mặc định có thể gây nhầm lẫn không cần thiết, mặc dù một số người cho rằng nó đáng giá khi thư viện của bạn được sử dụng bởi người gọi không sử dụng khung tiêm phụ thuộc. –

+0

Cảm ơn bạn đã liên kết. Trong trường hợp của tôi, tôi đang viết một ứng dụng độc lập thay vì một thư viện. Khuôn khổ tiêm phụ thuộc là một bậc thang lên bậc thang học tập từ nơi tôi bây giờ nhưng tôi nên điều tra. – Grokodile

Trả lời

3

Bao gồm hàm tạo mặc định là một mã có mùi như bây giờ lớp được kết hợp với việc triển khai thực hiện cụ thể IDirectoryInfoWrap. Để làm cho cuộc sống của bạn dễ dàng hơn, hãy sử dụng một thùng chứa IOC bên ngoài lớp để chèn các phụ thuộc khác nhau tùy thuộc vào việc bạn đang chạy mã thử nghiệm hay ứng dụng chính thống.

+1

http://martinfowler.com/bliki/InversionOfControl.html được thêm vào danh sách đọc của tôi, cảm ơn. – Grokodile

0

Đó là khá nhiều làm thế nào tôi làm điều đó.

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

    public MyUnitTestableClass() 
     : this(new DefaultImplementation()) 
    { 
    } 
} 
Các vấn đề liên quan