我正在尝试处理好的DDD原则,所以请原谅这个问题,如果它是noobish。
获取具有Books集合的Author对象。我想在我的作者上有一个IsAwardWinningAuthor属性,每本书都有一个IsAwardWinningBook属性。我是否只是让IsAwardWinningAuthor遍历(或查询或其他)Books集合,寻找IsAwardWinningBook为真的任何实例?这是否适合这种逻辑,即使它可能会触发我数据库中所有书籍的延迟加载?
谢谢!
答案 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标志一样简单,也可以更复杂。这取决于具体情况。