2009-01-31 37 views
4

我正在構建一個博客引擎來測試一些概念,如TDD和使用控制反轉...我想出了一個設置,我有一個通用的IBlogRepository接口,所以我可以同時支持SQL和XML。如何在像這樣的設置中使用IoC?有沒有更好的方法來測試這個?

public interface IBlogRepository : IRepository 
{ 
    Post GetPostById(Guid postId); 
    Post GetPostByFriendlyUrl(string friendlyUrl); 

    List<Post> GetPostsByAuthor(string userName);  
    List<Post> GetPostByTags(params string[] tags); 
    List<Author> Authors { get; } 

    void Delete(Post post); 
    void Delete(Comment comment); 
    void Save(Post post); 
    void Save(Comment comment); 
} 

的問題是XML庫比一個做數據庫需要不同的資源......這裏是構造函數:不需要由SQL博客庫

public XmlBlogRepository(string dataPath, IFileReader fileReader, IDirectoryReader directoryReader, ILogger logger) 
    { 
     this.dataPath = dataPath; 
     this.fileReader = fileReader; 
     this.directoryReader = directoryReader; 
     this.Logger = logger; 
    } 

的FileReader,directoryReader,和數據路徑。

這使得控制反轉加載IBlogRepository成爲不可能的問題,並且由於它們具有完全不同的ctors,所以它通常很難一般地使用它們。

我必須通過它們的原因是因爲如果我只是使用File.Open/Directory.GetFiles,那麼我將無法在硬盤上沒有XML文件的情況下單元測試該類。

+0

你用什麼工具測試它? – 2009-01-31 08:03:33

回答

7

我不明白爲什麼一個事實,即你的兩個IBlogRepository實現具有不同ctor簽名使IoC「不可能」;相反,這是IoC中的一種常見情況。它的處理方式是您的IoC框架(以及只有您的IoC框架)負責調用所需IBlogRepository實現的控制器。因此,您的IoC配置文件(或您使用的任何其他配置方法)知道正在使用哪個實現(畢竟必須有),但IBlogRepository服務的使用者只能通過其接口訪問它。

1

我認爲供應商將通過實現供應商滿足您的需求,你會在包裝的資源它

口碑不錯的link

+0

這基本上就是我所做的,但是因爲我希望這個類是可測試的,所以我必須將資源作爲接口傳遞,以便我可以讓模擬/僞造對象接管資源(文件讀取器,數據讀取器等)。 ) – sontek 2009-01-31 07:15:43

+0

提供者模型總比沒有好,但是在其他方面也是一個反模式(即IoC--見Andrew Swan的答案) – chadmyers 2009-01-31 07:29:32

相關問題