(实体-控制-边界模式)-> 如何处理两个实体?

2022-09-04 23:12:33

前提

我最近阅读/观看了Java冠军Adam Bien的许多文章/视频,他主张使用古老更新实体 - 控制 - 边界设计模式JAVA EE > = 6。

利用 CDI、EJB 3.1、JPA 2 和其他 JAVA EE 6 特性,此模式应该有助于创建更多面向业务的组件,更易于单元测试,并且基于职责具有更高的关注点分离。

由于我正在使用上面列出的所有功能,并且这种模式听起来非常有趣,因此我正在研究它,看看欧洲央行是否可以满足我的下一个项目要求。


到目前为止,我得到了什么

在欧洲央行中,每个逻辑实体被分成三部分(如果我错了,请纠正我):

  • 边界,一种强大的门面,唯一可以从外部进入的类。对于外部(如果我做对了),我们指的是应用程序之外的两者,例如。一个远程客户端,以及组件包的外部,例如。我申请的另一部分;

  • a(n可选)控制者,负责某种操作(例如,实体的验证);

  • 一个实体,可以是一个纯粹的JPA实体,但也可以包含一些装饰/验证/(最小)业务逻辑。

例如,考虑有两个不同的实体 ( 和 ),一个类用于对它们执行 CRUD () 和一个类用于对它们执行某些控制 ()。OrangeAppleFruitsManagerFruitsQualityChecker

直到昨天,它本来是这样的(旧方式):

com.foo.bar.business.FruitsService        /* CRUD    */
com.foo.bar.business.FruitsQualityChecker /* CONTROL */
com.foo.bar.model.Orange                  /* ENTITY  */
com.foo.bar.model.Apple                   /* ENTITY  */

而与欧洲央行合作,我会有(新方式):

com.foo.bar.business.oranges.boundary.Oranges       /* CRUD    */ 
com.foo.bar.business.oranges.control.QualityChecker /* CONTROL */
com.foo.bar.business.oranges.entity.Orange          /* ENTITY  */

com.foo.bar.business.apples.boundary.Apples         /* CRUD    */
com.foo.bar.business.apples.control.QualityChecker  /* CONTROL */
com.foo.bar.business.apples.entity.Apple            /* ENTITY  */

然后,我可以单独CRUD和研究每个实体,例如。跟

Oranges.findOrangesByPrice(min, max);

主要问题

我应该如何处理跨组件研究,例如findFruitsByPrice(min,max)

我应该同时调用和并求和结果吗?从哪个类,包装在哪里?如果我的搜索页面包含许多条件,并且必须跨越 50 个实体,该怎么办?运行每个实体的50倍搜索方法,然后进行插值,听起来像是一种非常丑陋的方式,对性能影响巨大。我想我仍然需要一个中心点来执行这种事情。它是否是另一个组件,例如,在其边界中调用其他边界?这一点对我来说是晦涩难懂的ATM。findOrangesByPricefindApplesByPriceSearches


题外话

将欧洲央行与基于行动的框架一起使用是否有意义?还是这种模式被降级为基于组件的框架?

我正在使用Struts2,这是一个基于MVC操作的框架,我对JSF2(JAVA EE 6标准,并在大多数Adam Bien的展示中使用)非常不熟悉,它是一个基于MVC组件的框架;

除了将架构视为“组件方式”的额外努力之外,是否有某些因素阻止我在业务层使用ECB?

由于Adam Bien示例中的大多数边界都是REST服务(通常更多的是Struts2 Actions的替代品,而不是“链中的新齿轮”),这让我怀疑它是否完全适合Struts2生态系统。

说出你的。请。


答案 1

据我所知,你对“到目前为止你得到了什么”是正确的。

对于您的主要问题:与其他设计模式一样,您可以简单地引入另一个SuperComponent,该组件在某些端点(或单个端点)中使用,因此它不会变得非常大。该SuperComponent将以正确的方式完成这些工作:如果需要,您将使用一些现有的组件,以便性能和代码质量不会受到影响。我在这里的意思是:你可能会编写与特定端点相关的逻辑,而不关心它是否返回Oranges和Apples,对DB进行单个查询(如果你的域模型能够做到这一点)。使用其他组件来获取这些水果并将它们合并是一个糟糕的设计,无论你使用什么设计模式(图像你稍后会得到鳄梨,然后你将不得不编写代码/纠正错误才能获得对新水果的支持)。

现在以某种方式与您的附带问题有关(恕我直言):欧洲央行对于小型项目是可以的,但对于较大的项目,您可能需要一个更具层次的结构:

  • 一个Web层,只处理来自用户的请求/输入(我不喜欢我的EJB知道s和s的想法)HttpRequestHttpResponse

  • 具有 DAO 层的多层应用程序模型(对于 CRUD 操作不是必需的,但对于在多个 EJB 中对 5 个参数使用相同的模型)。NamedQuery


答案 2

推荐