我几乎读过这里的每一个问题和www上的许多相关论点,但我仍然不确定是否能很好地理解这一点,而且可能我错过了其他人都很明显的东西,因为我认为这是一种很常见的情况。。。
请原谅我糟糕的英语和混乱的术语,但我对DAO与Repository的差异/优势/注意事项并不感兴趣,我认为这并不能改变问题的"核心",但也许我错了。
显然,这个例子太简单了,每个解决方案都很容易被高估,但把它看作是一个更大系统的"案例"。
假设你必须构建一个应用程序来建议售货员打电话给他们。
每个潜在客户都有一些"文本"数据(即姓名、性别、出生日期、地址、电话号码、电子邮件等)、一张照片以及他/她与其他人和供应商互动的一些历史记录。
文本数据位于Mysql表(人)中,照片位于文件系统中的某个位置,并且有人已经发布了服务,返回了一份可能有兴趣联系的人的列表,给出了销售人员和每个潜在买家的分数。
我可能会得到以下结果:
-
域名对象人,包括姓名、电话号码、地址、电子邮件和照片。所有属性的Setter和getter加上一个方法getScore()。
-
两个DAO,一个用于mysql表,另一个用于文件系统。
-
获取给定销售人员(应用程序的用户,不在本例的范围内)的潜在客户列表的服务。
我不清楚的是:
-
域对象中的方法getScore()是否可以直接调用服务层中的服务?如果没有,为什么?
-
对于来自不同DAO的数据,我需要单独的DTO吗?
-
如果是这样的话,我需要某种管理器或"超级"DAO,它拥有如何组装这两条信息的逻辑(即从mysql DAO获取URI,检索文件,加载图片)?它应该位于数据层还是服务层?(在我看来,应该留在数据层,只要它处理的是数据存储)。
-
管理器或"超级DAO"的输出应该是另一个DTO,或者可以直接是域对象?
-
如果是DTO,我是否需要一个调用管理器/超级DAO并构建域对象的服务(在这种情况下,我假设该服务将向域对象"添加"分数)。
这是一个清晰明了的问题,我知道,但我不知道如何设计解决方案。
答案的起点:
- 我认为
getScore()
方法应该属于服务,而不是域对象 - 品味问题
- 这是一项服务IMHO
- 服务的输出可以是DTO或域对象
简而言之(在我看来)
- 域对象是"哑"类(仅用于将数据与对象映射)
- DAO是用来获取数据的(仅此而已)
- DTO可以用作DAO和服务之间的中介
- 服务在这里执行相关操作(通过使用dao),例如在计算分数的情况下
从下到上允许使用,即服务可以使用DAO,但不能使用其他方式,以减少更改的可能性(例如:DB后端更改=>更新了DAO,仅此而已)
=>社区wiki