2009-05-22 60 views
1

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

因此,我有一个服务类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正在修改我传递给它的联系人。

我也有一种感觉,我没有看到其他一些陷阱,像潜在的不一致处理交易。

(顺便说一句,我已经使用这两种方法,并且不希望继续在无尽的循环重构。事情似乎只是错在这里。)

+0

请更好地解释什么是“门户”,为什么远程创建PortalAccount(创建它时发生了什么),以及为什么一旦创建它就保存它? – nightcoder 2009-05-22 23:07:49

+0

PortalAccount是一个本地域对象,用于保存关于外部门户上联系人帐户的信息。 PortalAccount对象不是远程创建的。但是,我所描述的PortalService实际上是在远程门户上创建一个用户帐户,然后创建并填充Contact的portalAccount引用。 因此,contact.getPortalAccount.getId()将在远程门户上返回一个联系人的用户ID(但它实际上并未打到远程门户,因为此信息存储在本地数据库中)。 – Boden 2009-05-22 23:40:22

回答

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打破单一职责原则,但国际海事组织在这种情况下,这是绝对正常的,因为我明白,你需要这个操作是原子的。对?

或者你可以添加布尔标志的方法,指示如果你想保存联系人。但是如果您从远程门户网站获得它时始终需要直接保存与PortalAccount的联系 - 那么不需要布尔标志。

PS。为什么你使用“this”关键字? portalService私有成员?如果是的话,那么也许你需要重新考虑你的命名约定,并命名带有前缀“_”的私人成员(例如,我认为这是最受欢迎的),就像_portalService - 然后很容易理解_portalService是私人成员。对不起主题。

祝你好运。