2012-12-02 35 views
1

整合,我們必須首先像DDD +休眠+ SOA的

class Person extends EntityBase<Person, PersonNumber>{ 
private PersonNumber personNumber; 
private String name; 
private Contact contact; 
private String educationLevel; 
} 
class Contact extends ValueObjectBase<Contact> { 
    private String phone; 
    private String address; 
    private String contactPerson; 
} 

的典範,但現在我們必須與花葯系統名爲「系統DC」的整合,一直是原來的人表拆開,將personNumber,姓名,電話,地址欄現已移至「系統DC」。和「SystemDC」提供一個數據庫視圖「DC_PersonView」給我們查詢。如果我們需要創建一個人,我們必須從「SystemDC」調用webservice。

所以我們定義了一個personDTO像

class PersonDTO{ 
private PersonNumber personNumber; 
private String name; 
private String phone; 
private String address; 
} 

計劃1:

  1. 重構人IPerson接口
  2. 在PersonWrape reposito定義PersonWrape類

    class PersonWrape implements IPerson { 
    private Person person; 
    private PersonDTO personDTO; 
    } 
    
  3. RY

    void SavePerson(IPerson person) { 
        systemDC.saveWebservice(person.getPersonDTO); 
        personRepository.save(person);// map the column not in systemDC like educationLevel to our person table. 
        } 
    

計劃2: 只修改personRepository:

void SavePerson(IPerson person) { 
     PersonDTO personDTO = PersonDTO.fromEntiry(person); 
     systemDC.saveWebservice(personDTO); 
     personRepository.save(person);// map the column not in systemDC like educationLevel 
     } 

但查詢的人是truble ..

我們如何在此種情況下的模型?請給我們一些建議。

+0

個人實體是否需要存在於兩個系統(有界上下文)中? – eulerfx

+0

是的,在我們的系統中我們需要完整的Person實體。但是我們必須更新Person實體,如1.更新我們的數據庫2.通過webservice更新另一列.. – tobato

+0

因此,系統DC只需要人員數據子集的副本?系統DC是否將任何人員數據存儲在您的系統中?系統DC是否處理需要在系統中反映的人員數據? – eulerfx

回答

0

看起來好像你有兩個有界上下文(BC)之間的集成場景。在這些情況下,通常可以辨別可以確定實體變化如何傳播的關係BC。

在您的使用案例中,您似乎有一個人的單一概念(每個人都有一個單一的身份在BC之間共享),但是您有兩個不同的BC,一個人在每個BC中包含和管理不同的人數據。然後,您討論的保存操作實際上是兩次保存操作,每個BC中都有一次。每個BC保存它感興趣的信息。如果你有一個用例,例如一個用於接受兩個BC的人員信息的UI表單,那麼這個用例應該將保存命令顯式地發送到兩個BC。您的計劃2最接近這種方法,但是我不會將該代碼放入存儲庫。相反,我會直接從表示層或應用程序層調用兩個不同的服務。

你也可以考慮什麼是是否有某種原始的BC之間關係的下游(姑且稱之爲一個)和系統DC。例如,如果DC位於A的人員數據的下游,則不是在保存期間顯式調用兩個服務,而是可以實施事件驅動的方法。通過這種方法,一個將發佈關於修訂個人數據和一個DC之間的集成點會訂閱這些事件,並進行適當的修改在DC事件。請注意,這種方法通常是eventually consistent。總的來說,事件驅動的方法更復雜,但也更靈活。

+0

感謝您的幫助! – tobato

1

使用DTO's並且在使用SOA時不公開域模式是很棒的。除此之外,任何其他事情都會變得混亂(嘗試在客戶端應用程序中使用域模型)。

然而問題是您嘗試將域模型作爲CRUD SOA服務公開。您不能讓SOA服務更改任何仲裁實體的字段。它必須遵循領域模型以及您在其中定義的方法和服務。

例如,如果在User類中有一個名爲CalculateAge的方法,則創建一個名爲CalculateUserAge的SOA方法,而不是稱爲UpdateUser的方法。

+0

「試圖在客戶端應用程序中使用域模型」這就是我們想要做的。因爲在我們的應用程序中,我們已經有了一個像'PersonRepository.save(person)'這樣的方法,但是在這個時候,原來的人被分成了兩部分。 – tobato