我在Gary McLean Hall的C#的單元測試/測試驅動開發部分的適應代碼。我的問題是基於本書中可能包含錯誤的示例。下面是UML圖的樣子爲例AccountService
在一個三層架構:我該如何解決這個循環依賴問題?
我有我的解決方案分成與層對應四個不同的項目:User_Interface,Business_Logic,Data_Access,和Unit_Tests。
我的問題涉及接口IAccountRepository
。在這本書的作者寫道的假類用來嘲笑IAccountRepository
接口的實現爲使用單元測試下面的代碼(在Unit_Tests項目):
class FakeAccountRepository : IAccountRepository
{
private Account account;
public FakeAccountRepository(Account account)
{
this.account = account;
}
public Account GetByName(string accountName)
{
return account;
}
}
我遇到的問題是, GetByName()
方法返回Account
類型。如果我嘗試將IAccountRepository
中的簽名更改爲Account
返回類型,它將找不到該類型。由於Account
類是業務邏輯層的一部分,如果我嘗試添加對Business_Logic項目的引用(來自Data_Access項目),Visual Studio會給我一個「循環依賴」錯誤。
這是有道理的,因爲數據訪問層是底層,而不應依賴於任何層以上本身......但沒有引用我不能在IAccountRepository
接口的Account
返回類型。
作者是否忘記了一些東西?我應該製作一個IAccount
接口,更改GetByName()
方法以返回IAccount
類型,並使Account
實現IAccount
接口?如果不是,我該如何解決這個問題?
感謝您的回覆。添加對「Common」項目的引用是否不會創建對它的依賴?我試圖學習最佳實踐,書中特別提到DAL應該能夠獨立地站在其他層面上。 DAL上的圖層取決於DAL,但DAL不能依賴於它上面的圖層。正因爲如此,我更傾向於選擇2.你認爲這是作者的意圖和意外遺漏嗎? –
選項2似乎是更好的選擇 - 正如您所提到的,它使DAL成爲獨立的功能包。 「共同」項目的混亂,所以我不會真正使用它 - 它是在那裏指出第二種方法的優點。 關於作者縮進 - 我只能猜測。也許他希望讀者自己修復它,比如下面提到的@Robert - 作者可能已經把所有東西放在一個項目中,但是不同的名稱空間。我認爲這對於演示,教育目的來說很好。 –