|
亲爱的 Cross,
感谢您的回答,因为他们为我能给出解决方案提供了足够的信息。下面是修改后的类图,用到了您出于比较目的提供的一些额外信息,就此我将提出如下建议。
图 3. 修正的高级体系结构
凭经验,我对代码的开发与测试独立进行表示赞同,他应该被打包成组件。让我们先假您的小组不反对 EJB。假如这样,我将推荐 Service 及 Task 都作为会话 bean 来实现。为何?因为您的小组没有注意到的会话 EJB 的好处是其可维护性及可靠性。
您要注意到 Service 及 Task 之间的一个区别是 Service 是远程访问的,而 Task 是本地访问的。因此,我提议为 Service 使用远程(Remote)接口,Task 使用本地(Local)接口,如图 4 所示。
图 4. 提议的使用远程服务及本地任务的高级体系结构
如果 Task 将有状态编程模型公开给服务(如我最先假设的那样),那么他们在 EJB 部署描述符中就可以声明为有状态的而不是无状态的。本地会话 EJB 的开销很低,所以即使他们是有状态的,性能不是问题。(另一种说法,某些人可能会争论说应该永远不要使用有状态会话 bean。然而,我们没有说过永远。我们乐意在此场合推荐他们,因为他们部署在本地 Service 当中;因此,无状态发生在开始于最外层代表 Service 会话 bean 的事务环境中。简而言之,如果您想接收位于会话外观后的本地实体 EJB,您也要接收位于其后的本地有状态会话 EJB。)在任何一种情况下,将 Task 转换为不管是否是有状态的会话 EJB 是有益处的。
当然,最大的益处是这个体系结构解决了您的重用及 EJB-REF 问题。构建 Service 的程序员可以使用 Task(以及正如您所描述的在某些情况下的 Service)。构建 Task 的程序员可以使用 Service。在两种情况下,每个会话 bean(Task 或 Service)的部署描述符仅仅包括他所实际使用的每个会话 bean 的 EJB-REF。保持了封装,这对可维护性至关重要。
使每个 Task 都成为 EJB 的另一个益处是您可以对 Task 进行单元测试,而与调用他们的 Service 无关(包括测试他们使用的 EJB-REF)。使组件容易测试所做的任何事情对可靠性都是有好处的。
还有,常常没有注意到的显式的基于 EJB 的方法的益处是您的业务逻辑可以利用 EJB 环境访问信息,例如用户的调用及当前活动的事务。这个能力简化了 Service 及 Task 方法的签名(我之所以没有问这个问题,是因为我假设用户 ID 及其他在会话环境中的信息是显式的传递到 Service 及 Task POJO 方法签名中的——但我们可以把这个问题保留在另一个讨论中)。
但即使说到这,我怀疑您仍不能将对 EJB 的使用显式的公开给小组。折衷的方法是生成“业务代表”并与 Task POJO 中的会话 EJB 组件相关联,如图 5 所示。
图 5. 生成业务代表并与服务及任务的 EJB 组件关联
需要改变 Service POJO 代码新建 Task Delegate 而不是 Task POJO。但好的 IDE 将帮助简化移植过程。并且改变是物有所值,因为这个方法将帮助使体系结构在部署操作方面更加面向服务且具有更强的灵活性。
祝在您以后的努力当中好运。
就到这里了,
您的 EJB 倡导者
|