2009-05-22 100 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是私人成員。對不起主題。

祝你好運。