我們有要求在用戶在活動頁面上輸入他們的電子郵件地址時添加事件提醒。事件是另一個域對象。我們最初的想法是創建一個Customer領域對象和相關的CustomerService:單元測試域對象
public class CustomerService {
public void AddEventReminder(string emailAddress, int eventId) {
var customer = new Customer(emailAddress);
customer.AddEmailReminder(eventId);
}
}
我們如何能在一個單元測試驗證AddEmailReminder方法確實呼籲新客戶?
我的想法:
- 使用一個工廠來創建客戶。這種氣味是因爲我認爲你只能在對象創建中存在一些複雜性的情況下使用工廠。
- 錯誤代碼。也許有更好的方法來做到這一點?
- 莫克魔法。
在另一個筆記(可能是相關的)上,我們如何決定這裏的聚合根?我們已經任意決定了客戶,但它同樣可以是事件。我已閱讀並理解有關聚合根源的文章,但在這種情況下還不清楚。
該域服務方法的要點在於,它直接從已收到包含電子郵件地址和事件ID的dto的應用程序服務中調用。我認爲域對象應該只處理完整的對象,所以域服務應該處理這個問題。我不明白爲什麼它是貧血意味着它不應該繼續在域服務上,如果有什麼我會認爲這是相反的方式,因爲域對象都是關於邏輯的。重新聚合根,我同意他們都是聚合根,我問的問題是哪個聚合根負責協會? – JontyMC 2010-01-07 11:07:52
...雖然有趣的答案。如果我要更改簽名,將創建客戶聚合根負責的代碼是什麼?也許這是更相關的問題。 – JontyMC 2010-01-07 11:09:42
我懷疑服務是從應用程序層映射的。但是,在這種情況下,它不是一個域服務 - 它是一個應用層服務,屬於該層。在這種情況下,我認爲你需要一個可以根據電子郵件地址查找現有客戶的抽象工廠(可能是一個CustomerRepository)。 – 2010-01-07 11:35:55