逻辑应该驻留在哪里,以便从DAO组装域对象



我几乎读过这里的每一个问题和www上的许多相关论点,但我仍然不确定是否能很好地理解这一点,而且可能我错过了其他人都很明显的东西,因为我认为这是一种很常见的情况。。。

请原谅我糟糕的英语和混乱的术语,但我对DAO与Repository的差异/优势/注意事项并不感兴趣,我认为这并不能改变问题的"核心",但也许我错了。

显然,这个例子太简单了,每个解决方案都很容易被高估,但把它看作是一个更大系统的"案例"。

假设你必须构建一个应用程序来建议售货员打电话给他们。

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

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

我可能会得到以下结果:

  1. 域名对象人,包括姓名、电话号码、地址、电子邮件和照片。所有属性的Setter和getter加上一个方法getScore()。

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

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

我不清楚的是:

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

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

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

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

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

这是一个清晰明了的问题,我知道,但我不知道如何设计解决方案。

答案的起点:

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

简而言之(在我看来)

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

从下到上允许使用,即服务可以使用DAO,但不能使用其他方式,以减少更改的可能性(例如:DB后端更改=>更新了DAO,仅此而已)

=>社区wiki

相关内容

  • 没有找到相关文章

最新更新