【发布时间】:2009-05-22 22:33:29
【问题描述】:
我有一个包含 PortalAccount 对象的 Contact 类。当我想为联系人创建“门户帐户”时,使用soap/axis 在门户应用程序上远程创建一个帐户,然后填充联系人的portalAccount 并保存联系人(本地数据库保存有关远程帐户的信息,例如用户 ID 和用户名等)。
所以我有一个服务类 PortalServiceImpl,它具有在给定联系人实例的情况下在远程门户上实际创建用户的方法。
鉴于所有这些信息,我的问题是:PortalServiceImpl 是否应该获取 ContactDAO 对象的实例并实际进行保存,或者 PortalServiceImpl 类是否应该只创建远程用户,修改传入的 Contact 对象,然后让客户负责保存?
方法一:
class ServiceFacadeImpl {
public void createPortalAccount(Contact contact) {
// here the contact is implicitly saved
this.portalService.createPortalAccount(contact);
}
}
方法二:
class ServiceFacadeImpl {
public void createPortalAccount(Contact contact) {
// here contact is implicitly modified
this.portalService.createPortalAccount(contact);
this.contactDAO.save(contact);
}
}
我觉得这两种方法都不对。方法 1 感觉不对,因为 PortalService 正在创建远程用户并将联系人保存到数据库中(尽管是通过 DAO 接口)。方法 2 感觉不对,因为我不得不假设 PortalService 正在修改我传递给它的 Contact。
我也有一种感觉,我没有看到其他一些问题,例如可能无法始终如一地处理交易。
(顺便说一句,我已经用过这两种方法了,不想再死循环重构。这里似乎有些不对劲。)
【问题讨论】:
-
请详细解释一下什么是“门户”,为什么要远程创建PortalAccount(创建时那里发生了什么),为什么一创建就保存?跨度>
-
PortalAccount 是一个本地域对象,它保存有关外部门户上联系人帐户的信息。 PortalAccount 对象不是远程创建的。但是,我所描述的 PortalService 实际上在远程门户上创建了一个用户帐户,然后创建并填充了联系人的 portalAccount 引用。因此contact.getPortalAccount.getId() 将在远程门户上返回联系人的用户ID(但实际上并没有命中远程门户,因为此信息存储在本地数据库中)。