我希望这个问题不是太抽象。这是关于Java EE体系结构或服务设计。 我有两个业务逻辑(这里为了便于阅读而简化):
@Stateless
@LocalBean
public class EmailService {
@EJB
private SomeBean someBean;
// ... some other EJBs to acces the DB layer (and using JPA)
public void sendEmail(String recipient /* some parameters */) {
// ... some email sending logic here
}
}
@Stateless
@LocalBean
public class ExecutePaymentService {
@EJB
private UserBean userBean;
// ... some other EJBs to acces the DB layer (and using JPA)
public void executePayment(int amount, int userId) {
// ... some payment logic here
// NEED TO SEND EMAIL HERE
}
}
我的设计是JSF Managed Beans正在调用上述服务。我的问题是Managed Beans包含一些逻辑:
- 执行付款
- 如果付款成功发送电子邮件
- 如果不做别的事情
我想在服务EJB中使用这个逻辑,因此托管Bean只收集输入并返回结果。
其他选项是ExecutePaymentService
扩展EmailService
然后调用sendEmail。这可以导致巨大的继承树能够从任何服务提供任何服务,更难以长期维护和大应用程序....由于大多数服务需要注入EJB来访问数据库我不能使用非EJB服务......
什么是允许service to call another service
的更好方法?
答案 0 :(得分:0)
你应该问自己,ExecutePaymentService是一个电子邮件服务。
也许电子邮件服务只是您需要的功能主义者之一?
为什么不将电子邮件服务注入ExecutePaymentService?
我的回答可以应用于其他方法,例如WebSerivces(可以使用EJB实现),这更像是经典的面向对象设计,而不是真正的Java技术设计问题,并且一旦你理解了ExecutePaymentService是在它的基础上一个EmailService(我感觉答案是否定的) -
你会明白如何更好地模拟豆类。