Architecture 领域对象设计

Architecture 领域对象设计,architecture,domain-driven-design,audit,Architecture,Domain Driven Design,Audit,在设计域模型时,应坚持使用表示问题域的内容,并且域模型不应包含审核信息 所以,如果我设计一只猫,它可能看起来像这样: public Cat { private Color furColor; private Color eyeColor; private boolean isDeclawed; etc... } 我不应该有像“updateDate”和“createTime”这样的属性,对吗 现在,如果一个web应用程序要在屏幕上显示一张猫表,您可能会看到如下内

在设计域模型时,应坚持使用表示问题域的内容,并且域模型不应包含审核信息

所以,如果我设计一只猫,它可能看起来像这样:

public Cat {
    private Color furColor;
    private Color eyeColor;
    private boolean isDeclawed;
    etc...
} 
我不应该有像“updateDate”和“createTime”这样的属性,对吗

现在,如果一个web应用程序要在屏幕上显示一张猫表,您可能会看到如下内容:

Name Eye Color Claws? Last Updated ------ --------- ------ ------------ Fluffy Green No 10/31/2012 etc... 眼睛颜色爪子的名字?最后更新 ------ --------- ------ ------------ 蓬松绿编号10/31/2012 等 那么,如果您没有在域模型中保留上次更新时间,那么如何(正确地)将该数据获取到页面中呢

显然,我可能有一个设计糟糕的领域模型,但我想做得更好

我曾经考虑过创建一个接受泛型的对象,这样我就可以保持我的域模型原始。 i、 e

公共持久对象{
私有域对象;
私人日期更新日期;
私有用户更新器;
接球手、接球手等。。。
}
不过,恐怕我会遇到一些问题

我在“域模型”和“更新日期”等方面做了很多搜索。。。但我想我错过了正确的术语


有人能给我指出正确的方向吗

在你的场景中,我不确定我是否同意第一句话。如果您的域的一般用途包括需要显示这些日期,那么它们可能(而且很可能应该)是您的普通域对象的一部分

如果您想清理域对象,只需创建一个接口来保存这些公共字段

public interface ITrackedObject
{
    DateTime LastUpdated { get; set; }
    //etc....
}

public class Cat : ITrackedObject
{
    public DateTime LastUpdated { get; set; }
    //....
}

我会尽力的。我想你可能是把东西和唱片混在一起了。上次更新的日期不是更新cat的时间,而是更新记录的时间。在OO中,很自然地会认为可以将有关该对象的所有内容封装在一个对象中。但对象本身并不表示任何上下文。即使在你的猫里面,你也有一个颜色类型,如果你没有办法得到rgb或cmyk值,它本身就不算什么

在OO的第一天,教员们展示的第一个样本之一是,猫是一个畸形儿,畸形儿是活的实体,等等。没有理由不在您的域对象中进行最后一次修改,或者即使最后一次更新也是一个很好的调用。但是,如果你能将对象与其他对象进行分离和建模,以及如果它们有太多的定义,它们将如何受到限制(是的,我说是有限的,因为它已经决定了很多事情)。我并不是想建议您考虑对象的重用,但是对于一个模型来说,正确的关系非常重要,您应该能够在10英尺或10000英尺的视图中提供上下文和含义

我在平台研发部门工作了近9年,对平台进行建模和开发,历时多年。有一件事总是让我们丧命,那就是让一两个ia-a和has-a关系倒退。这将使模型变得毫无用处,在这一点上,最好是有一个200列的平面表,但是在一个大的甚至是一个小的模型中重构一对关系是一个重大的挫折。对象不是记录,甚至不是类,而是赋予数据意义的对象

因此,简而言之,MyBizObject扩展了MyBizRecord在所有书籍中的推荐方式,但 MyBizProduct。。。扩展MyBizMaterial 数组MyBizRecord[]changeHistory; ....
功能强大得多,如果有一天你需要添加MyBizOrders[]作为历史记录,你就不必重新修改整个模型和工厂。我相信这并不是你期望看到的,但我希望它能让你找到你想要的答案

所以,如果你有一个PhoneNumber类没有自己的数据库,它也会扩展TrackeObject?它实际上不需要DateTime属性,对吗?您的所有域对象不需要扩展
TrackedObject
…只扩展被跟踪的对象。要使其正常工作,需要在域内设置
LastUpdated
属性。它应该是持久性不可知的(所以在数据库列中没有“默认”值等)。我喜欢这种策略,但是我会使用接口
ITrackedObject
,否则如果没有超类实现
TrackedObject
@Aphelion,你就无法从
Animal
继承了-非常好的一点,我也在考虑同样的问题,尽管如此,每个子类都需要实现LastUpdated属性。我只是想避免那样。我认为这取决于特定的对象模型,尽管您的方法显然更灵活。那么,为什么带有泛型的模型不起作用呢?我可以将一个持久对象传递给我的DAO,同时仍然有一个pristing猫模型。它确实可以让轮子转动。谢谢你花时间回答。迪格,你为什么需要审计线索?为什么需要显示“上次更新”列?
public interface ITrackedObject
{
    DateTime LastUpdated { get; set; }
    //etc....
}

public class Cat : ITrackedObject
{
    public DateTime LastUpdated { get; set; }
    //....
}