我很好奇從REST層服務的實體中分離核心域實體的首選方式是什麼。如何從REST域中分離數據核心域?
我在這個啓發性的Spring REST教程http://spring.io/guides/tutorials/rest/1/上看到,直接在REST層中公開核心域模型是一件好事,因爲它應該獨立於核心域模型而進化。
核心服務是處理和生產事件。這些事件被視爲應用程序的通信端口。核心服務沒有看到任何REST域實體。而REST控制器沒有看到任何核心域實體。
爲了使事情更簡單,讓我們考慮只有一個實體Order實體的例子。
本教程演示了Order REST域類如何通過REST請求傳遞給控制器。反過來,控制器創建一個傳遞給Order處理事件的OrderDetails實體,以創建一個CreateOrderEvent事件,然後將其傳遞給返回另一個OrderCreatedEvent事件的服務。控制器最終從返回的事件中創建一個REST域Order實體,並將其發送到響應中。
我們可以看到,對於這一個實體,核心域實體有一個類,REST域實體有一個類,事件有效載荷實體有一個類。另外,我們可以看到,坐在應用程序核心中的事件擴展了一些基本的事件,這些事件強烈地提醒了HTTP方法。看到這個REST就像滲透到應用程序核心中的東西,當我們試圖首先做的事情是將應用程序核心與REST層分離時,有點令人驚訝。
任何想到這個設計或一些替代設計?是否有任何實現這種解耦的首選方式?
感謝您的任何建議。
親切的問候,
斯特凡
一個額外的問題,我現在有...
我應該去實體NotFoundException異常或在事件notFoundEntity事件成員,一個REST域從數據域中解耦?
發送回控制器的事件可以攜帶可用於控制器的notFoundEntity成員狀態。
這裏是事件notFoundEntity邏輯:
protected boolean notFoundEntity = false;
public boolean isNotFoundEntity() {
return notFoundEntity;
}
public static OneAdminEvent notFound(Long id) {
OneAdminEvent oneAdmiEvent = new OneAdminEvent(id);
oneAdmiEvent.notFoundEntity = true;
return oneAdmiEvent;
}
的服務更新取決於該實體的事件構件狀態已找到或沒有:
Admin admin = adminRepository.findOne(deleteAdminEvent.getId());
if (admin == null) {
return AdminDeletedEvent.notFound(deleteAdminEvent.getId());
在控制器中,以檢查呼叫對於已找到與否的實體:
if (adminDeletedEvent.isNotFoundEntity()) {
}
這與符合去耦設計。
但是,我不確定解耦事件應該攜帶這些信息。這些信息可以被看作是一個例外,一個商業習慣例外。
此外,使用異常使得它可以指定在事務註釋回滾屬性:
@Transactional(rollbackFor = NotFoundException.class)
有了一個例外,唯一沒有發現實體邏輯左邊是服務,事件不包含任何。
服務現在看起來像:
Admin admin = adminRepository.findOne(deleteAdminEvent.getId());
if (admin == null) {
throw new NotFoundException("No admin was found with the id " + deleteAdminEvent.getId());
什麼憑經驗使用決定何時在事件中使用的成員國以及何時使用業務自定義異常?
Iam不知道答案。但我曾經與openmrs這個醫療記錄系統合作過。 REST層中有一個與核心應用程序分離的獨立模塊。你可以看看它的設計。 – geekgugi
@geekgugi謝謝,我會看看他們的REST層,它應該很有趣。 – Stephane
他們正在使用彈簧AOP。 – geekgugi