在观看来自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