将 Presentation Modal 对象传递给服务和业务层

Passing Presentation Modal objects to the service and business layer

我正在使用 struts2 EJB3(Service/business 层)和 Hibernate 开发 Web 应用程序。我使用 Wildfly 10 作为服务器。 Struts 稍后介绍,业务层的 EJB3 以及简单的 java 类 作为服务层,稍后使用 hibernate 进行持久化。 现在,在我的一项操作 类 中,我已将模态对象传递给服务层(简单 java 类)。现在,当我创建 EAR 并尝试将其部署到 WIldfly 上时。 WIldfly 拒绝启动。然后我意识到我的 ejb 模块无法找到 web 模块的 类。所以现在我有两种方法来解决这个问题:-

1) 将我的网站 类 包含在 EJB jar 中:- 我认为这将完全破坏分层架构以及表示层和服务层的解耦。

2) 或者将模态 类 映射到服务层中存在的其他模态 类:- 还需要在服务层中创建冗余 POJO 类。

真的不知道在这种情况下我应该怎么做,如果有人可以建议我一些更好的分层结构

您可以通过多种方式为每一层构建模型,但归根结底,这取决于您希望将每一层与另一层耦合的程度。

显然,最精细、最干净的解决方案是让每一层都有自己的模型,并在每个集成点相应地进行映射。

  1. 持久性模型,例如你的 @Entity
  2. 领域模型,例如那些你的服务层作为输入和 returns 作为输出。
  3. 查看模型,例如您的表示层将这些作为输入,returns 作为输出。

这种区别的优势在于它允许每个级别的模型随着时间的推移而变形,而不会对它上面的层级产生重大影响。换句话说,添加新字段或更改持久性模型的某些内容并不一定意味着您的域模型必须更改,而只是它们之间的映射代码。

显然,互联网上有许多资源提倡简单地重复使用您的 @Entity 类 作为每一层的模型和简单的应用程序,这绝对是可以接受的。但在更复杂、可扩展的解决方案中,最终会成为一种负担。

有时可以将 (1) 和 (2) 折叠成一个模型,@Entity,然后使用特殊的视图模型进行渲染,这样至少在制作模型时您的视图代码不会受到影响更改 over-time,但在很多情况下,对于复杂的应用程序,我通常会错误地选择对所有三层使用不同的模型。