多个服务层对象应该共享DAO吗?

时间:2009-05-22 22:33:30

标签: dao oop

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

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

鉴于所有这些信息,我的问题是:如果PortalServiceImpl获取ContactDAO对象的实例并实际执行保存,或者如果PortalServiceImpl类只是创建远程用户,则修改传入的Contact对象,并让客户负责储蓄?

方法1:

class ServiceFacadeImpl {
  public void createPortalAccount(Contact contact) {
    // here the contact is implicitly saved
    this.portalService.createPortalAccount(contact);
  }
}

方法2:

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正在修改我传递给它的联系人。

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

(顺便说一句,我已经使用了这两种方法,并且不想继续在无限循环中进行重构。这里似乎有些错误。)

1 个答案:

答案 0 :(得分: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是私有成员。对不起offtopic。

祝你好运。