领域驱动设计 - 父处理子项

时间:2010-06-29 19:49:26

标签: domain-driven-design

我正在尝试处理好的DDD原则,所以请原谅这个问题,如果它是noobish。

获取具有Books集合的Author对象。我想在我的作者上有一个IsAwardWinningAuthor属性,每本书都有一个IsAwardWinningBook属性。我是否只是让IsAwardWinningAuthor遍历(或查询或其他)Books集合,寻找IsAwardWinningBook为真的任何实例?这是否适合这种逻辑,即使它可能会触发我数据库中所有书籍的延迟加载?

谢谢!

4 个答案:

答案 0 :(得分:2)

不要试图在过程中过早解决潜在的性能问题(但也不要忽略它们)。

与往常一样, 实际执行查询的方式取决于数据的性质以及如何使用。如果你有一个批处理进程运行数十/数千条记录,你想让SQL Server处理它。

但是,如果您只需要执行一次或两次查询,记录较少,则可以使用内存中的循环。

您需要解决的问题是:使用查询规范打包查询,并使Author对象使用此新查询规范。

最初,只需将其设为一个简单的循环即可。当您发现它太慢时,请通过调用数据库(通过FindAwardWinningBookCount上的AuthorRepository方法)替换循环。

重要的部分是:您的Author对象不再负责处理查询 - 而是使用查询规范。更改查询规范的实施应该影响Author行为

有关详细信息,请参阅Evan的书中的第229至234页。

答案 1 :(得分:0)

问题根本不是域驱动设计。这是关于技术的。

从域驱动设计的角度来看 - 重要的是你正确反映了域名(在这种情况下 - 当任何一本书获奖时,作者都会获奖)。在您的模型中,数据库不存在相关的性能问题。

不幸的是 - 我们不能忽视它们。

但帮助你有点困难。您没有指定您正在使用的技术。从提到延迟加载我猜你正在使用ORM。然后再说 - 我没有想到哪一个。

我已经使用过NHibernate,它非常聪明,可以在延迟加载书籍集合上按作者ID外键过滤书籍。因此 - 它并没有导致选择所有书籍,而只是我需要的书籍。

使用ORM时的另一个常见问题您可能不知道所谓的select n+1 problem


关于ddd ......

不要停下来,不要只是假设你理解它。破解是一个该死的难题。

答案 2 :(得分:0)

我在当前的项目中大量使用ORM(NHibernate),并且我开始倾向于只记录一条信息,如果它很重要的话。在你的情况下,我只会在作者身上记录他们是获奖作家。如果我需要找到这本书,我可以写一个特殊的查询来找到他们所有的获奖书籍。这样做效率更高,然后加载所有书籍只是为了找到一个简单的事实。

答案 3 :(得分:0)

我会对此进行建模,以便作者知道她/他是否是AwardWinning。当书籍成为AwardWinning时,它通知其作者(通过调用OnBookBecameAwardWinning方法)它成为获奖者。这种方法可以像在作者上设置AwardWinning标志一样简单,也可以更复杂。这取决于具体情况。