(实体-控制-边界模式)-> 如何处理两个实体?
前提
我最近阅读/观看了Java冠军Adam Bien的许多文章/视频,他主张使用古老但更新的实体 - 控制 - 边界设计模式JAVA EE > = 6。
利用 CDI、EJB 3.1、JPA 2 和其他 JAVA EE 6 特性,此模式应该有助于创建更多面向业务的组件,更易于单元测试,并且基于职责具有更高的关注点分离。
由于我正在使用上面列出的所有功能,并且这种模式听起来非常有趣,因此我正在研究它,看看欧洲央行是否可以满足我的下一个项目要求。
到目前为止,我得到了什么
在欧洲央行中,每个逻辑实体被分成三部分(如果我错了,请纠正我):
-
边界,一种强大的门面,唯一可以从外部进入的类。对于外部(如果我做对了),我们指的是应用程序之外的两者,例如。一个远程客户端,以及组件包的外部,例如。我申请的另一部分;
-
a(n可选)控制者,负责某种操作(例如,实体的验证);
-
一个实体,可以是一个纯粹的JPA实体,但也可以包含一些装饰/验证/(最小)业务逻辑。
例如,考虑有两个不同的实体 ( 和 ),一个类用于对它们执行 CRUD () 和一个类用于对它们执行某些控制 ()。Orange
Apple
FruitsManager
FruitsQualityChecker
直到昨天,它本来是这样的(旧方式):
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。findOrangesByPrice
findApplesByPrice
Searches
题外话
将欧洲央行与基于行动的框架一起使用是否有意义?还是这种模式被降级为基于组件的框架?
我正在使用Struts2,这是一个基于MVC操作的框架,我对JSF2(JAVA EE 6标准,并在大多数Adam Bien的展示中使用)非常不熟悉,它是一个基于MVC组件的框架;
除了将架构视为“组件方式”的额外努力之外,是否有某些因素阻止我在业务层使用ECB?
由于Adam Bien示例中的大多数边界都是REST服务(通常更多的是Struts2 Actions的替代品,而不是“链中的新齿轮”),这让我怀疑它是否完全适合Struts2生态系统。
说出你的。请。