4

我正在開發一個Web API項目。我正在調用一個負責數據庫交互的存儲庫。該存儲庫與第三方數據源進行交互。依賴注入的實現

我想實現依賴注入(DI)到存儲庫層注入第三方數據源的依賴關係,但是我該如何實現這一點,因爲在該第三方DLL中沒有接口?

我使用Unity框架。

第三方DLL僅包括一類:

using System; 
using System.Collections.Generic; 

namespace MoviesLibrary 
{ 
    public class MovieDataSource 
    { 
     public MovieDataSource(); 
     public int Create(MovieData movie); 
     public List<MovieData> GetAllData(); 
     public MovieData GetDataById(int id); 
     public void Update(MovieData movie); 
    } 
} 

回答

6

請問這個第三方組件涉及到資料庫?它是否是由存儲庫內部使用的獨立服務?如果是這樣,這聽起來像第三方組件本身是另一個應該被抽象的依賴。

您可以通過創建自己的接口來反應您打算執行的業務操作以及此服務將實現的接口。它可能精確匹配的服務實現,但並不需要:

public interface IMovieService 
{ 
    int Create(MovieData movie); 
    List<MovieData> GetAllData(); 
    MovieData GetDataById(int id); 
    void Update(MovieData movie); 
} 

然後你可以抽象此接口的實現背後的依賴性:

public class MovieService : IMovieService 
{ 
    private MovieDataSource dataSource = new MovieDataSource(); 

    // methods simply delegate to the dataSource object 
} 

現在你有一個接口,您可以使用依賴注入,並且您可以在不依賴第三方組件的情況下測試存儲庫時模擬測試。

+0

我有點困惑,我對DI和repository沒有足夠的知識。我不明白這一行 - 這個第三方組件如何與存儲庫相關聯?它是否是由存儲庫內部使用的獨立服務?我使用的圖層(webapi-> repository-> External DLL)不合適? – F11 2014-09-10 14:36:52

+1

@little:如果第三方組件*是存儲庫實現,那麼它可能根本不需要注入/模擬。我以爲你有一個數據庫存儲庫,只需要一個單獨的服務組件作爲依賴項來使用它的一些功能。但是,如果整個存儲庫只是委託給第三方組件,那麼對於單元測試,只有集成測試沒有任何意義,所以不需要注入它。 – David 2014-09-10 14:39:02

+0

感謝大衛,只是一個小問題,我可以在webapi和外部數據源層之間使用存儲庫嗎? – F11 2014-09-10 14:43:43