【问题标题】:Where should reside the logic to assemble the domain object from DAO?从 DAO 组装域对象的逻辑应该放在哪里?
【发布时间】:2014-12-09 13:57:56
【问题描述】:

我已经阅读了这里的几乎所有问题以及 www 中的许多相关论点,但我仍然不确定是否能很好地理解这一点,并且可能我错过了对其他人来说显而易见的东西,因为我认为很常见的情况...

请原谅我糟糕的英语和混淆的术语,但我对 DAO 与存储库的差异/优势/警告并不感兴趣,我认为这不会改变问题的“核心”,但也许我错了。

显然这个例子太简单了,每个解决方案都很容易矫枉过正,但请将此视为一个更大系统的“案例”。

假设您必须构建一个应用程序来建议销售人员致电。

每个潜在客户都有一些“文本”数据(即姓名、性别、出生日期、地址、电话号码、电子邮件等)、一张照片以及他/她与其他人和供应商互动的一些历史记录。

文本数据存储在 Mysql 表(人)上,照片位于文件系统中的某个位置,并且某人已经发布了服务,该服务返回一个可能有兴趣联系的人的列表,给定推销员和每个潜在买家的分数。

我可能会得到以下结果:

  1. 域对象人员,具有姓名、电话号码、地址、电子邮件和照片。所有属性的 Setter 和 getter 以及 getScore() 方法。

  2. 两个DAO,一个用于mysql表,一个用于文件系统。

  3. 一项服务,用于获取给定推销员(应用程序的用户,不在本示例范围内)的潜在客户列表。

我不清楚的地方:

  1. Domain Object中的getScore()方法可以直接调用服务层的服务吗?如果不是,为什么?

  2. 对于来自不同 DAO 的数据,我是否需要单独的 DTO?

  3. 如果是这样,我需要某种管理器或“超级”DAO,它拥有有关如何组装这两条信息的逻辑(即从 mysql DAO 获取 URI、检索文件、加载图片)?这应该驻留在数据层还是服务层? (在我看来应该留在数据层,只要它处理的是数据存储)。

  4. 管理器或“超级 DAO”的输出应该是另一个 DTO 还是可以直接是域对象?

  5. 如果是 DTO,我是否需要一个服务来调用管理器/超级 DAO 并建立域对象(在这种情况下,我假设该服务会将分数“添加”到域对象)。

这是一个清晰的问题,我知道,但我无法弄清楚如何设计解决方案。

【问题讨论】:

    标签: java jpa dao domain-object


    【解决方案1】:

    答案的起点:

    1. 我认为getScore() 方法应该属于服务而不是域对象
    2. 口味问题
    3. 恕我直言,这是一项服务
    4. 服务的输出可以是 DTO 或域对象

    简而言之(在我看来)

    • 域对象是“哑”类(只是在这里将数据与对象映射)
    • DAO 在这里获取数据(仅此而已)
    • DTO 可用作 DAO 和服务之间的中介
    • 服务在这里执行相关操作(通过使用 dao),例如计算分数

    允许从下往上使用,即。服务可以使用 DAO,但不能反过来使用,以减少更改的可能性(例如:数据库后端更改 => DAO 更新,仅此而已)

    => 社区维基

    【讨论】:

    • 嗨,感谢您的回答,但我还是有点困惑:
    • DAO = 访问数据,DO = 表示数据,所以不是同一个类恕我直言
    • 艾伦,我已经阅读了这篇文章,我同意作者声称贫血模型为程序风格设计带来的观点,但这不是我的问题的重点:假设你把所有的逻辑都放在你的可以在域对象中并仅将服务用于您无法轻松还原到特定事务​​的事务,我仍然不确定将逻辑放入 DO 以将其自身组装成 DAO(或者顺便说一下 DTO)是一个好主意,至少当你有多个时。问题是:我必须在 DTO 和 DO 处于一对一关系时也将它们分开,而我可以/应该扩展 DTO 以添加逻辑吗?
    • 删除了以前的 cmets,他们因为一个错误而感到困惑。这是问题的正确版本:DTO 和 DO 是否可以是同一个对象(可能实现不同的接口或让 DO 扩展 DTO)或者我应该避免这种情况并始终从服务器从 DAO 接收的 DTO 重建 DO?
    • 再次恕我直言,DTO 是工具(包装器),因此 DO 和 DTO 之间不应存在继承。例如,假设您需要一个 Person 及其分数(按分数排序)的列表,可以使用包含 2 个字段 Person 和一个 score 的 DTO(我们称之为 ScoredPerson)并实现 @ 987654326@
    猜你喜欢
    • 2013-12-09
    • 2017-03-27
    • 1970-01-01
    • 2016-12-18
    • 2014-10-26
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多