如何避免贫血领域模型?

时间:2011-11-01 20:12:44

标签: service domain-driven-design repository anemic-domain-model

我正在尝试通过示例学习领域驱动设计,我需要您的建议。 假设我有一个名为Tender的实体。 我收到外部服务的肥皂消息; 该消息包含有关招标的所有信息(tenderId,tenderSum,...)

我必须做的事情:

  1. 使用Soap Web Service接收消息并将消息发送到 消息队列 - 由服务
  2. 完成
  3. 从队列中检索邮件 - 由服务
  4. 完成
  5. 转到数据库,通过tenderId检索Tender对象或创建新的招标 - 由存储库
  6. 完成
  7. 使用消息中的值填充Tender对象的字段 - 由域对象招标
  8. 完成
  9. 将招标保存到数据库 - 由存储库
  10. 完成

    我尝试以正确的方式进行,但最后我发现,大多数代码都存在于服务,存储库等中。 我真的很困惑。我做错了什么?我应该在域对象中做所有这些吗?

3 个答案:

答案 0 :(得分:3)

DDD中的某些实体/值对象的行为很少,这种情况并不少见。我几乎可以肯定,在任何项目中,你至少会有一些实体/ VO只有一些构造逻辑并且是不可变的。这些不是DDD的主要关注点。

您应该专注于识别和(重新)定义有界上下文和聚合。你会在网上找到很多有关这方面的信息(dddcommunity是一个很好的起点,但我强烈建议至少观看几次你能从Eric Evans,Udi Dahan和Greg Young那里找到的视频)

并且不要太担心 - 无论你有多好,都需要几次失败才能做到正确:)

答案 1 :(得分:2)

我发现,随着模型的发展,生活在服务中的所有东西都会随着时间的推移而变化。在您的示例中,一个选项可能是让您的实体的方法成员名为Tender.LoadValuesFrom[ServiceName](val1, val1, etc)(提供的服务名称在域中具有意义)。

这样至少你让实体负责加载自己的值。有时奇怪的服务会显得贫血。如果它发生在任何地方或感觉真的很尴尬,那么它可能试图告诉你一些事情。否则我不会过分强调它。

答案 2 :(得分:1)

猜猜你并不是唯一一个这样的想法。通常在我的模型中最终得到的是验证,聚合管理,我也尝试着重于Value Objects。尽量减少自动属性,邀请您快速开发而不用考虑...... 前段时间我在博客上写了一篇关于这篇文章的文章...... http://magnusbackeus.wordpress.com/2011/05/31/preventing-anemic-domain-model-where-is-my-model-behaviour/

但这是一项迭代工作,找到了正确的模型。准备好做很多重构......