在观看了 Jimmy Bogard ( http://ndcoslo.oktaset.com/Agenda )的 NDC12 演示文稿“Crafting Wicked Domain Models”之后,我一直在思考如何坚持这种领域模型。
这是演示文稿中的示例类:
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;
}
}
所以这个域模型中包含一些规则:
- 会员必须有名字和姓氏
- 报价数量不能在外部更改
- 会员负责创建新报价,计算其价值和分配
如果尝试将其映射到某些 ORM,如 Entity Framework 或 NHibernate,它将无法正常工作。那么,使用 ORM 将这种模型映射到数据库的最佳方法是什么?
例如,如果没有 setter,我如何从 DB 加载 AssignedOffers?
唯一对我有意义的是使用命令/查询架构:查询总是使用 DTO 作为结果,而不是域实体,并且命令是在域模型上完成的。此外,事件溯源非常适合域模型上的行为。但这种 CQS 架构可能并不适合每个项目,尤其是棕地。或不?
我在这里知道类似的问题,但找不到具体的示例和解决方案。