Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Architecture DAO层应该如何实现?一个表道还是多个表道?_Architecture_Dao_Dependency Management_Design Principles_Layered - Fatal编程技术网

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

Architecture DAO层应该如何实现?一个表道还是多个表道?,architecture,dao,dependency-management,design-principles,layered,Architecture,Dao,Dependency Management,Design Principles,Layered,我正在按照分层架构实现一个模块。它将有一个表示层、服务层、业务层和DAO层。 根据分层架构指南,通信流应该是自上而下的。类似地,依赖关系也应该是自上而下的,即表示层-使用->服务层-使用->业务层-使用->DAO层。i、 业务层不应该依赖于服务层,同样地 问题1: 每层的输入应该是什么?既然服务层是从表示层调用的,那么服务层应该接受UIBean作为输入吗?还是服务Bean作为输入? 业务层和DAO层也是如此 问题2: DAO层应该是每个表还是可以处理多个表(所有表都由单个模块拥有)?我的模块的数

我正在按照分层架构实现一个模块。它将有一个表示层、服务层、业务层和DAO层。 根据分层架构指南,通信流应该是自上而下的。类似地,依赖关系也应该是自上而下的,即表示层-使用->服务层-使用->业务层-使用->DAO层。i、 业务层不应该依赖于服务层,同样地

问题1:

每层的输入应该是什么?既然服务层是从表示层调用的,那么服务层应该接受UIBean作为输入吗?还是服务Bean作为输入? 业务层和DAO层也是如此

问题2:

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转换为服务bean并将其传递给服务层

  • 服务层: 将服务bean转换为业务bean并将其传递给业务层。还协调各种从属服务之间的调用。处理事务边界。将服务bean返回到表示层

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

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


我将在整个回答中使用社交网络网站的例子

  • 您的UI应该依赖于您的服务,但只能是单向的。想象一下,当您在UI上有一些帖子,并且打算实现“Like”功能时的情况。直观地说,当用户单击一篇文章的Like按钮时,应该在相应的表中创建一条记录,然后显示在UI上。因此,您需要实现一个类似的功能,这在UI上意味着您有一个POST请求处理程序,它调用服务层中相应的方法,传递用户ID和帖子ID。服务层应该对UI完全不可知,应该只处理会话验证并在业务层调用相应的方法。您的业务层应该处理您操作的逻辑,并确保您在DAO层中的方法正在被调用,以便在数据库中创建一个相似的记录,并且可能会发生您可能需要的其他事情。当所有要调用的DAO方法都成功执行时(如果没有,则必须正确处理错误),业务层应响应服务层,服务层应向用户发送电子邮件,以通知用户并响应UI

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

  • 见第2点


  • 所以,如果我插入一个雇员记录,服务层的输入应该是EmployeeServiceBean,对吗?另外,根据您的评论,我当前的实现是否正确?@Ni3取决于您的技术。我不确定传递bean在您的上下文中意味着什么,但如果它并不意味着传递对更高级内容的引用,那么它似乎是正确的。例如,如果社交网络增长,你的服务豆甚至需要在移动应用程序上运行(回到例子)。在流程中,您描述的示例中的逻辑顺序是正确的。如果我的答案解决了你的问题,那么你可以考虑接受它作为正确的答案。