2009-09-25 77 views
3

我剛剛閱讀了Eric Evans撰寫的「領域驅動設計:解決軟件核心的複雜性」問題,並試圖編寫我的第一個以域爲中心的應用程序(使用C#)。開始使用TDD和DDD

我們的服務檯將使用該應用程序來跟蹤計算機向用戶的分配情況。

我畫了一個簡單的類圖來反映域的一部分。它看起來像這樣...

Class diagram showing two classes: Owner and Computer. There is a one-way associate between Computer and Owner named 'Allocate to' http://www.freeimagehosting.net/uploads/183dd57031.jpg

我還發現我的第一個特徵(撥出計算機的用戶),並寫了它的測試...

[Test] 
public void AllocateToUser() 
{ 
    var user = new Owner("user1"); 
    var computer = new Computer("computer1"); 

    computer.Allocate(user); 

    Assert.AreEqual(user.Username, computer.AllocatedTo.Username); 
} 

最後,我編寫了代碼來使測試通過。

public class Computer 
{ 
    public Computer(string name) 
    { 
     Name = name; 
    } 

    public string Name 
    { get; private set; } 

    public Owner AllocatedTo 
    { get; private set; } 

    public void Allocate(Owner owner) 
    { 
     AllocatedTo = owner; 
    } 
} 

public class Owner 
{ 
    public Owner(string username) 
    { 
     Username = username; 
    } 

    public string Username 
    { get; private set; } 
} 

到目前爲止,這麼好(我認爲)。

然而,顯然沒有一個地址持久性。我想我需要爲計算機引入一個存儲庫類。也許這樣的事:

public class ComputerRepository 
{ 
    public void Store(Computer computer) 
    { 
     //Some persistence logic here (possibly using NHibernate?) 
    } 
} 

現在我卡住了。如何確保將對計算機分配的用戶所做的更改傳遞到存儲庫?

我似乎有以下幾種選擇:

  1. 修改計算機類的分配方法的實施instanstiate ComputerRepositry的實例,並調用Store方法。

  2. 創建接口IComputerRepository;修改計算機的構造函數以要求提供實現IComputerRepository的類的實例。在Allocate方法中,針對此注入的實例調用Store。

  3. 創建一個服務(AllocationService),該服務將調用分配和存儲。

  4. 責任心傳遞到客戶端,迫使兩個步驟調用代碼:

    • 調用分配上電腦課
    • 的一個實例,實例化ComputerRepository的一個實例,並調用存儲。

沒有這些似乎滿意:

  1. 難以測試,因爲我是電腦類中直接實例庫。

  2. 通過使用依賴注入來避免此問題。然而它仍然很醜,因爲每次我想要實例化計算機時,都需要傳入IComputerRepository的某個實例。

  3. 過於程序化,未能封裝域實體類中的行爲。

  4. 看起來很醜。

我該怎麼做?

回答

5

通常我會把行爲和持久化看作是兩個不同的問題並分別進行測試。

Domain對象應該不知道存儲庫的存在(儘管顯然不是相反的方式)。

我們在這種情況下所做的是創建一個控制器(或服務),負責從其存儲庫加載適當的對象,調用對象的行爲,然後調用存儲庫以保持更新。

然後,您可以使用Mock存儲庫測試控制器,以檢查控制器是否正在使用更新的對象調用存儲庫。