我剛剛閱讀了Eric Evans撰寫的「領域驅動設計:解決軟件核心的複雜性」問題,並試圖編寫我的第一個以域爲中心的應用程序(使用C#)。開始使用TDD和DDD
我們的服務檯將使用該應用程序來跟蹤計算機向用戶的分配情況。
我畫了一個簡單的類圖來反映域的一部分。它看起來像這樣...
我還發現我的第一個特徵(撥出計算機的用戶),並寫了它的測試...
[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?)
}
}
現在我卡住了。如何確保將對計算機分配的用戶所做的更改傳遞到存儲庫?
我似乎有以下幾種選擇:
修改計算機類的分配方法的實施instanstiate ComputerRepositry的實例,並調用Store方法。
創建接口IComputerRepository;修改計算機的構造函數以要求提供實現IComputerRepository的類的實例。在Allocate方法中,針對此注入的實例調用Store。
創建一個服務(AllocationService),該服務將調用分配和存儲。
責任心傳遞到客戶端,迫使兩個步驟調用代碼:
- 調用分配上電腦課
- 的一個實例,實例化ComputerRepository的一個實例,並調用存儲。
沒有這些似乎滿意:
難以測試,因爲我是電腦類中直接實例庫。
通過使用依賴注入來避免此問題。然而它仍然很醜,因爲每次我想要實例化計算機時,都需要傳入IComputerRepository的某個實例。
過於程序化,未能封裝域實體類中的行爲。
看起來很醜。
我該怎麼做?