Domain Driven Design是否需要在域对象之外实现业务逻辑。

时间:2010-12-29 22:44:27

标签: logic domain-driven-design

域的模型是我用作POCO的实体,这意味着没有基类,没有接口,没有属性。

因此,验证规则之类的业务逻辑必须在实体之外。 (Anemic Domain Model

这是否符合域驱动设计?

2 个答案:

答案 0 :(得分:2)

没有。不是真的。

域驱动设计的主要目标是尽可能明确地捕获和封装模型中的业务域。业务总是包含行为,因此 - 您的对象也应该具有行为。

  

域的模型是我用作POCO的实体,这意味着没有基类,没有接口,没有属性。

...并且不应使用c#,。net clr。这是基础设施,对吗? ;)

这些是表达您的模型的工具。您应该尝试降低噪音水平,将您的模型分开,但您将无法完全失控,因为它是用编程语言和技术表达的现实生活模型。

不过,您可能想要研究永不允许域对象处于无效状态的想法。如果它认为这种特殊的验证与业务无关 - 首先不应该在域模型中。

答案 1 :(得分:1)

这是一个非常哲学的问题。我真的想给出同样的哲学答案,所以这里有:

正如我理解域驱动设计一样,最重要的是,无论谁知道某些事情,都会用这些知识做事。我相信这与this article交织在一起。

考虑到这一点,你的普通旧物体应该有执行“生死”的手段 - 重要的任务(这会使你的解决方案出错)。

然而,另一种看待它的方式是这些普通的旧对象是最小的可用数据集,几乎就像基元一样。然后发生的是拥有这些数据对象的对象,它们是域驱动设计中的实际模型对象。并且它们不必完全相关(这将使您的解决方案正确)。

如果模型和数据层由两个完全独立的设计师设计,或者如果一个人能够切换帽子,则很容易发生这种情况。或者可能是一点点......哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇让我举个例子:

论坛

  

我们需要什么?我们需要用户,主板,线程和帖子。最后3个在数据层中都有“one to many”关系。一个板有很多线程,一个线程有很多帖子。一个用户也有很多帖子,一个用户启动许多线程(可以通过在线程中查找第一篇文章的作者来获得,因此可能不必存储在数据层中)。但是表现层发生了什么?

     

查看电路板时,我们希望查看该电路板中的所有可用线程。但我们不会满足于看到线程的名称,以及启动它的用户的名称。我们还希望查看每个帖子中的帖子数量,以及帖子中最后一张海报的名称以及发布时间。

我们现在正在研究一个与数据层有些不同步的模型对象。它将包含业务逻辑以从给定数据对象计算所需数据,然后它将能够使用视图所需的数据加载某种视图。模型中不需要吸气剂或固定剂,因此封装永远不会被破坏。模型对象符合域,域应该依赖于可用性需求,而不是数据存储的限制。数据对象符合旧的数据存储方式。

这将为我们提供数据抽象层(带有pocos),mvc,域驱动设计。赢得? :)