1

我有一个包含 PortalAccount 对象的 Contact 类。当我想为联系人创建“门户帐户”时,使用soap/axis 在门户应用程序上远程创建一个帐户,然后填充联系人的portalAccount 并保存联系人(本地数据库保存有关远程帐户的信息,例如用户 ID 和用户名等)。

因此,我有一个服务类 PortalServiceImpl,它具有在给定 Contact 实例的情况下在远程门户上实际创建用户的方法。

鉴于所有这些信息,我的问题是: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 正在修改我传递给它的联系人。

我也有一种感觉,我没有看到其他一些问题,比如可能无法始终如一地处理交易。

(顺便说一句,我已经用过这两种方法了,不想在一个无休止的循环中继续重构。这里似乎有问题。)

4

1 回答 1

3

您确定在本地和远程拥有不同的联系人 ID 是个好主意吗?这对我来说似乎是错误的,但也许我只是不知道您的域。

在我的应用程序中,所有新联系人都通过 Web 服务发送到远程门户并保存在那里。因此,当我在本地保存新联系人时,它会被发送到远程门户并保存在那里。也许你需要同样的?

如果上述想法对你来说是不可接受的,那么我会这样做:

class ServiceFacadeImpl {
  public void CreatePortalAccountAndSaveContact(Contact contact) {
    try
    {
      contact.portalAccount = this.portalService.createPortalAccount(contact);
      this.contactDAO.save(contact);
    }
    catch(...)
    {
      // do cleanup, for example do you need to delete account from remote 
      // portal if it couldn't be saved locally?
      // If yes, delete it from portal and set contact.portalAccount = null;
    }
  }
}

有人可能会说,CreatePortalAccountAndSaveContact 打破了单一责任原则,但在这种情况下,imo 是绝对正常的,因为据我了解,您需要此操作是原子的。对?

或者您可以在方法中添加布尔标志,指示您是否要保存联系人。但是,如果您总是需要在从远程门户获取联系人后直接保存与 PortalAccount 的联系 - 则不需要布尔标志。

PS。为什么使用“this”关键字?portalService 是私有成员吗?如果是,那么也许您需要重新考虑您的命名约定并使用前缀“_”命名私有成员(我认为这是最流行的),例如 _portalService - 那么很容易理解 _portalService 是私有成员。对不起题外话。

祝你好运。

于 2009-05-23T00:26:49.333 回答