我正在嘗試域驅動設計和事件採購。我打算使用(在C#中開發)NServiceBus,JOliver的EventStore和NES綁定它們。我已經有了一個簡單案例的基礎結構(只有一個具有值對象的聚合根)。DDD:繼承和交易
我正在閱讀埃文斯藍色書籍,我正在嘗試開發一個簡單的領域模型,並從我的工作領域(暖通空調維護公司的ERP和CRM)中抽取實例。
我正在建模一個簡單的子域,即HVAC機器和它們之間的關係。機器有各種類型,例如熔爐,燃燒器,空調,壓縮機,通用組件。每臺機器可以有多臺兒童機器。所有機器類型共享一些常見數據和一些常見行爲。但每種類型都有其他數據和特定行爲,例如,您只能將燃燒器對象添加到爐子中。
我的分析的第一個結果是每臺機器都應該是一個聚合根(從NES中的AggregateBase繼承而來),因爲它必須能夠保存對特定機器的引用(例如插入涉及單個機器的修復記錄,故障記錄等),還可以減少大型機器樹中的併發問題。
我的假設是這樣如下:
public class Machine : AggregateBase
{
public DateTime InstallationDate { get; private set; }
public Guid ManufacturerId { get; private set; }
public Guid ModelId { get; private set; }
}
public class Furnace : Machine
{
public List<Burner> burners { get; private set; }
// other furnace properties
public void AddBurner(Burner burner)
{
// perform validation
this.Apply<BurnerAdded>(x=> x.burnerAdded = burner);
}
public void Handle(BurnerAdded @event)
{
this.burners.Add(@event.burnerAdded);
}
}
public class Burner : Machine
{
// burner specific properties/methods
}
,但是我有些疑惑:
這是代表我的域名以正確的方式?我讀過類繼承是不鼓勵的,但在我看來,這是一個完美的例子(一個燃燒器是一臺機器,一個爐子也是如此)。我將僅限於一個級別的繼承。
是否有可能通過Event Sourcing實現類繼承?特別是建議的技術棧(nServiceBus,EventStore,NES)?
我應該如何執行添加子機(例如爐子的燃燒器)?此操作可分爲兩部分:
- 將新的Burner添加到Burner存儲庫。
- 添加一個引用到燃燒器的父爐燃燒器列表 但這兩個操作全局修改兩個聚合根,所以操作應該在兩個獨立的命令處理程序/交易中執行......但第二個取決於第一個...這是一些模型錯誤的證據嗎?我可以批量nServicebusMessages在一起執行操作,但我讀了這是不好的...
如果我讓孩子機器引用父,父母丟失兒童機器列表(其中需要進行驗證),我無法查詢事件採購存儲庫以獲取Guid以外的其他屬性。
預先感謝在討論任何貢獻,
感謝您的幫助。問題在於燃燒器獨立於爐子存在,它只是一個可以在熔爐之間切換的組件(因此它肯定具有標識),並且可以被其他域對象直接引用(例如服務事件) – Max 2013-02-18 08:49:14