0

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

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

显然,这个例子太简单了,每个解决方案都很容易矫枉过正,但把它看作是一个更大系统的“案例”。

假设您必须构建一个应用程序来向销售人员推荐要致电的人。

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

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

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

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

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

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

我不清楚的是:

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

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

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

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

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

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

4

1 回答 1

0

答案的起点:

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

简而言之(在我看来)

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

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

=> 社区维基

于 2014-10-14T17:47:15.833 回答