【问题标题】:Aggregates and Repository. How to determine aggregates?聚合和存储库。如何确定聚合体?
【发布时间】:2010-11-16 13:38:28
【问题描述】:

我最近一直在研究存储库模式,将其作为一种将所有持久性细节隐藏在涉及客户端代码的地毯下的方法。在阅读时,似乎存储库是/可以[通常?]负责聚合,而不仅仅是直接的类。

这对我来说很有意义,因为您可以有一个定义 Posts 的类和另一个定义 Comments 的类。这使得聚合成为理想的候选者,因为两者非常密切相关。但是,我将如何表示 Users 类及其与他或她的Posts 的关系?

将用户与 Posts/Comments 聚合进行聚合,还是单独保留 Users 并通过良好的老式参考建立关联是否有意义? p>

我曾尝试使用 Google 自己寻找答案,但我找到的很多示例都是独立的。即,Posts/Comment 或者可能是 OrderOrderLine 等。我找不到任何可以显示其他相关类如何组合在一起的内容。 p>

我没有将其应用于任何特定的事物,尽管 PHP 或 Java/C# 可能是我希望使用这些想法的领域。无论如何,在我逃跑并创造一个怪物之前,我只是在探索并试图了解其中的一些想法和概念。 :)

感谢您的宝贵时间。

【问题讨论】:

    标签: php design-patterns oop repository-pattern aggregation


    【解决方案1】:

    存储库模式的定义相当松散,不一定与聚合模式有任何关系。但是,如果您订阅 DDD 做事方式,那么是的,存储库对于聚合是唯一的。

    让我们从 DDD 的角度来看看这个。 DDD 表示聚合内的对象可以引用另一个聚合根,但聚合内的对象只能通过根访问。确定聚合的经验法则是删除根时应删除的内容。但是,与大多数方法相比,DDD 更不鼓励使用关系,因为关系存在于域中,它不需要存在于您的域模型中,因此请记住这一点。

    在您的情况下,当您删除帖子时,我假设您也会删除 cmets,但不会删除创建帖子的用户或评论它的用户。因此,您在定义帖子/评论聚合时是正确的,但将用户分组到该聚合中是没有意义的。

    用户作为其自己的聚合体,可以包含与其所有帖子的关系,因为 Post 是聚合根。您还可以在 PostRepository 上实现此方法以获取给定用户的所有帖子。希望对您有所帮助!

    【讨论】:

    • 啊,我明白了。如果一个对象完全依赖于另一个对象,那么聚合它们是有意义的。因此,没有帖子,评论就无法存在。尽管我想您需要在某些地方划清界限-删除用户并不一定意味着他们的帖子/评论消失了,即使他们这样做了,无论如何将用户作为一个单独的实体更有意义。顺便说一句,将实际 SQL 用于查询数据库 [或我用于持久性的任何机制] 的逻辑位置在哪里?它会在存储库中还是在聚合中……甚至更低?感谢您的帮助!
    • 你明白了。存储库作用就好像它是一个内存中的集合,但被实现为转到您的数据存储。这意味着存储库的接口没有提及 SQL 或数据访问,但实现有,那就是您的抽象。
    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多