在觀看來自Jimmy Bogard(http://ndcoslo.oktaset.com/Agenda)的NDC12演示文稿「Crafting Wicked Domain Models」後,我徘徊於如何堅持這種領域模型。
這是從演示示例類:帶有行爲和ORM的豐富域模型
public class Member
{
List<Offer> _offers;
public Member(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
_offers = new List<Offer>();
}
public string FirstName { get; set; }
public string LastName { get; set; }
public IEnumerable<Offer> AssignedOffers {
get { return _offers; }
}
public int NumberOfOffers { get; private set; }
public Offer AssignOffer(OfferType offerType, IOfferValueCalc valueCalc)
{
var value = valueCalc.CalculateValue(this, offerType);
var expiration = offerType.CalculateExpiration();
var offer = new Offer(this, offerType, expiration, value);
_offers.Add(offer);
NumberOfOffers++;
return offer;
}
}
所以有包含在該域模型的一些規則:
- 會員必須有姓和名
- 報價數量不能改變外
- 會員負責創建新優惠,計算其價值和分配
如果嘗試將此映射到像Entity Framework或NHibernate這樣的一些ORM,它將無法工作。 那麼,使用ORM將這種模型映射到數據庫的最佳方法是什麼?
例如,如果沒有setter,我該如何從DB加載AssignedOffers?
對我來說唯一有意義的事情就是使用命令/查詢體系結構:查詢總是以DTO作爲結果完成,而不是域實體,並且命令在域模型上完成。此外,事件採購非常適合領域模型上的行爲。但這種CQS架構並不適合每個項目,特別是棕地。或不?
我知道這裏有類似的問題,但找不到具體的例子和解決方案。
我剛看了同一個視頻,我想知道同樣的事情。你如何看待在構造函數中傳遞一個poco,並且在Member類中擁有隻讀屬性以返回該poco的一個克隆?這樣你就可以獲取數據進出域對象,以便保存或傳遞它。 – stralsi
對象快照?它可能會工作,但也需要一些黑客來使它與ORM工具一起工作。我個人看不出任何簡單的方法,它會帶來很多抽象和概括,你將不得不在整個應用程序開發中進行戰鬥。事件採購是走向IMO的唯一途徑 –
我其實只是看了這段視頻,想着同樣的事情;這是否意味着你需要一套DTO/POCO對象來存放ORM保存的數據/持久層,然後使用像AutoMapper這樣的映射器映射到一個域對象?像這樣的事情發生在存儲庫中嗎?看起來像EF Code First這樣的ORM希望得到一個帶有getter和setter的POCO。 – Abe