哪里应该存在从DAO组装域对象的逻辑?

时间:2014-10-14 17:14:46

标签: java jpa dao domain-object

我已经阅读了这里的几乎所有问题以及www中的许多相关论点,但我仍然不太清楚这一点,并且我可能会错过对其他人都很明显的事情,因为我认为是相当普遍的情况...

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

显然,这个例子太简单了,而且每个解决方案都容易过度使用,但我认为这是一个更大系统的“案例”。

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

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

文本数据驻留在Mysql表(人)上,照片位于文件系统中的某个位置,有人已经发布了一些服务,这些服务返回了一个潜在的有兴趣联系的人员列表,给出了销售员和每个潜在客户作为买家的分数。

我可能最终会得到以下结论:

  1. 域对象人员,包括姓名,电话号码,地址,电子邮件和照片。所有属性的塞特犬和吸气剂加上方法getScore()。

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

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

  4. 我不清楚:

    1. 域对象中的getScore()方法可以直接调用服务层中的服务吗?如果没有,为什么?

    2. 我是否需要单独的DTO来处理来自不同DAO的数据?

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

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

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

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

1 个答案:

答案 0 :(得分:0)

答案的起点:

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

    • 域名对象是" dumb"类(只是这里用对象映射数据)
    • DAO 来取这些数据(就是这样)
    • DTO 可用作DAO和服务之间的中介
    • 服务在这里执行相关操作(通过使用dao),在您的情况下计算分数,例如

    允许从下到上使用,即。服务可以使用DAO而不是相反,以减轻更改的可能性(例如:数据库后端更改=> DAO更新及其更新)

    =>社区维基