DAO层应如何实现?一个表DAO还是多个表DAO?

时间:2019-05-24 08:53:27

标签: architecture dao dependency-management design-principles layered

我正在按照分层体系结构实现模块。它将具有表示层,服务层,业务层和DAO层。 根据分层体系结构指南,通信流程应自上而下。类似地,依赖性也应该自上而下,即表示层-使用->服务层-使用->业务层-使用-> DAO层。即业务层也不应依赖服务层。

问题1:

每层的输入应该是什么?由于服务层是从表示层调用的,因此服务层是否应该接受UI Bean作为输入?还是Service Bean作为输入? 业务层和DAO层相同。

问题2:

DAO层应该按表排列还是可以处理多个表(全部由一个模块拥有)?我模块的数据存储在多个表中。由于所有这些表都由单个模块拥有,因此我认为拥有一个DAO层是有意义的,该DAO层从上层抽象出数据的多表存储。另外,如果需要插入DAO层的不同实现(数据库存储,SVN存储等),则插入单个实现(处理所有数据)是有意义的。此外,就获取数据而言,多表DAO将提高性能(单个联接查询就足够了)

问题3:

如果考虑多表DAO设计,则DAO层的输入将是业务bean。 DAO层负责将业务Bean转换为多个DB Bean,每个DB Bean代表一个表并处理持久性。 但这与分层架构不兼容,在分层架构中,分层表示各层应该是隔离的,任何层都不应该依赖于其上层。在这种情况下,DAO层的输入是业务Bean(不是DB Bean),并且从业务Bean到DB Bean的转换(反之亦然)是DAO层的责任,这意味着它知道如何将业务Bean转换为DB Bean。反之亦然。

有人可以在上面澄清一下吗?实现此类模块的正确方法应该是什么?当前的实施是否按照指南进行? 适当的解释会很有帮助。谢谢!

我目前的实现方式是

  • 表示层: 将UI bean转换为service bean,并将其传递给Service层。

  • 服务层: 将服务bean转换为业务bean并将其传递到业务层。还协调各种依赖服务之间的呼叫。处理交易边界。将服务bean返回到表示层。

  • 业务层: 将业务bean传递到DAO层。将服务bean返回到服务层

  • DAO层: 将业务Bean转换为DB Bean,反之亦然。将业务bean返回到业务层。

1 个答案:

答案 0 :(得分:0)

在整个答案中,我将使用一个社交网站的示例。

  1. 您的UI应该取决于您的服务,但仅是单向的。想象一下当您在UI上有一些帖子并且打算实现“赞”功能时的情况。直观地,当用户单击帖子的“赞”按钮时,应在相应表中创建一条记录,然后在UI上显示该记录。因此,您需要实现一个Like功能,该功能在UI上意味着您有一个POST请求处理程序,该处理程序在服务层中调用相应的方法,并传递用户的ID和帖子的ID。服务层应该与UI完全无关,并且应该仅处理会话验证并在业务层中调用相应的方法。业务层应依次处理操作的逻辑,并确保调用DAO层中的方法,以便在数据库中创建一个Like记录,并且可能会发生一些您可能需要的其他事情。当所有要调用的DAO方法成功执行后(如果未成功执行,则必须正确处理错误),业务层应响应服务层,服务层又应将电子邮件发送给用户以得到通知并响应用户界面。

  2. 当心这条称为“过早优化”的巨龙。您应该有一个DAO层,因为它将大大简化您的生活。如果以后您遇到一些性能问题,则必须解决它们。但是,如果您将遇到性能问题,则很有可能是由其他原因引起的。 DAO层意味着您有一个表示DAO的层。

  3. 请参阅第2点。