我的目标是创建一个基于纯域驱动设计的系统。据我所知,这意味着我的域对象应该有行为而不是形状。也就是说,他们不应该有任何吸气剂或其他访问者。
与此同时,我正在尝试跟踪TDD流程,并遇到了我正在尝试编写测试的绊脚石。
[Test]
public class new_purchase_order_should_have_purchase_ordernumber_of_1
{
PurchaseOrder po = PurchaseOrder.CreatePurchaseOrder()
Assert.AreEqual(1,po.PurchaseOrderNumber);
}
public class PurchaseOrder
{
private int _purchaseOrderNumber;
static CreatePurchaseOrder()
{
_purchaseOrderNumber = SomeWayOfGettingAPONumber()
//other initialisation
}
public int PurchaseOrderNumber {get { return _purchaseOrderNumber;}
}
如果不允许使用getter,如何验证CreatePurchaseOrder()方法是否正确运行并将值设置为1.
在尝试实施此设计时,这对我来说是一个很大的概念障碍,因此任何建议都非常有用。
由于
答案 0 :(得分:6)
为什么域对象不能拥有属性?你谈到的纯粹行为,它只是静态方法,它们与Domain Objects无关。
wikipedia告诉我们:
业务对象本身通常不执行任何操作,但包含一组实例变量或属性,也称为属性,以及与其他业务对象的关联,编织表示业务关系的对象映射。
业务对象没有行为的域模型称为Anemic Domain Model。
因此,转向,域对象应具有属性和(在大多数情况下)行为。
域模型 - 包含行为和数据的域的对象模型
答案 1 :(得分:1)
实现这一目标的一种方法是遵循CQRS想法。
CQRS将查询与架构级别的行为(因此名称)进行划分,并使用域模型发布的事件来公开状态。
但是很难掌握并正确实施。特别是如果您一般没有领域驱动设计理念的经验。
因此 - 不要犹豫暴露状态,只要确保它只能从对象本身修改。