簡體   English   中英

開始使用TDD和DDD

[英]Getting started with TDD and DDD

我剛讀完Eric Evans的“領域驅動設計:解決軟件核心的復雜性”,我正在嘗試編寫我的第一個以域為中心的應用程序(在C#中)。

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

我已經勾勒出一個簡單的類圖來反映域的一部分。 看起來像這樣......

顯示兩個類的類圖:所有者和計算機。 計算機和所有者之間存在名為“分配給”的單向關聯.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; }
}

到目前為止,這么好(我想)。

然而,顯然這些都沒有解決持久性問題。 我想我需要為Computer引入一個存儲庫類。 也許這樣的東西:

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

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

我似乎有以下選擇:

  1. 修改Computer類的Allocate方法的實現,以實例化ComputerRepositry的實例並調用Store方法。

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

  3. 創建一個服務(AllocationService),它將包含對Allocate和Store的調用。

  4. 將resposibility傳遞給客戶端,強制調用代碼的兩個步驟:

    • 在Computer類的實例上調用Allocate
    • 實例化ComputerRepository的實例並調用Store。

這些似乎都不令人滿意:

  1. 很難測試,因為我將直接在Computer類中實例化存儲庫。

  2. 通過使用依賴注入來避免這個問題。 但是它仍然是丑陋的,因為我每次想要實例化計算機時都需要傳遞一些IComputerRepository實例。

  3. 過於程序化,無法將行為封裝在域實體類中。

  4. 看起來很難看。

我該怎么辦?

通常我會將行為和持久性視為兩個不同的問題,並分別進行測試。

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

我們在這種情況下所做的是創建一個Controller(或服務),負責從其存儲庫加載適當的對象,調用對象上的行為,然后調用存儲庫來保存更新。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM