如何将数据核心域与REST域解耦?

如何将数据核心域与REST域解耦?,rest,decoupling,Rest,Decoupling,我很好奇,将核心域实体与REST层服务的实体解耦的首选方法是什么 我在这个富有启发性的SpringREST教程中看到,不直接在REST层中公开核心域模型是一件好事,因为它应该独立于核心域模型而发展 核心服务是处理和生成事件。这些事件被视为应用程序的通信端口。核心服务没有看到任何REST域实体。并且REST控制器看不到任何核心域实体 为了使事情更简单,让我们考虑只有一个实体的例子,顺序实体。< /P> 本教程展示了REST请求如何将Order REST域类传递给控制器。反过来,控制器创建传递给订单

我很好奇,将核心域实体与REST层服务的实体解耦的首选方法是什么

我在这个富有启发性的SpringREST教程中看到,不直接在REST层中公开核心域模型是一件好事,因为它应该独立于核心域模型而发展

核心服务是处理和生成事件。这些事件被视为应用程序的通信端口。核心服务没有看到任何REST域实体。并且REST控制器看不到任何核心域实体

<>为了使事情更简单,让我们考虑只有一个实体的例子,顺序实体。< /P> 本教程展示了REST请求如何将Order REST域类传递给控制器。反过来,控制器创建传递给订单处理事件的OrderDetails实体,以创建CreateOrderEvent事件,然后将该事件传递给返回另一个OrderCreatedEvent事件的服务。控制器最终从返回的事件创建一个REST域Order实体,并在响应中发送它

我们可以看到,对于这一个实体,核心域实体有一个类,其余域实体有一个类,事件负载实体有一个类

此外,我们可以看到,位于应用程序核心中的事件扩展到一些基本事件,这些基本事件强烈地提醒了HTTP方法。当我们首先尝试将应用程序核心与REST层分离时,看到这种类似REST的东西渗透到应用程序核心中,这有点令人惊讶

对这个设计或其他设计有什么想法吗?有没有更好的方法实现这种脱钩

谢谢你的建议

亲切问候,

斯蒂芬

我现在还有一个问题

我应该在与数据域分离的REST域中查找实体NotFoundException异常还是事件中的notFoundEntity事件成员

发送回控制器的事件可以携带可在控制器中使用的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()) {
}
在控制器中,调用以检查是否已找到实体:

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());

使用什么样的经验法则来决定何时在事件中使用成员国以及何时使用业务自定义异常?

对于这个示例应用程序来说,更难将REST域和核心域层解耦。不仅其余(又称“视图”)对象与核心(又称“域”)对象完全分离,而且它们的直接通信也通过内部事件驱动体系结构实现了解耦。核心事件如此强烈地提醒您HTTP方法的原因可能更多地是由于示例用例的简单性,而不是出于需要或设计。这可能是一个危险的例子


虽然这无疑是一种合理的分层应用程序的方法,但真正的问题是对于您的特定场景是否有必要这样做。如果您的应用程序非常面向数据(例如,一个几乎没有业务规则的数据输入系统),那么您可能不需要一组单独的REST域对象(在很大程度上,您可能决定在传统MVC应用程序中不需要单独的“视图”对象层)。您可以采用SpringDataREST方法(参见OliverGierke的示例应用程序)。同样,如果您的核心中有一些繁重的业务逻辑,并且希望创建一个丰富的域模型,那么您最好使用一个更解耦的体系结构。

我不确定答案。但我曾使用openmrs,一种医疗记录系统。REST层中有一个单独的模块,该模块和核心应用程序解耦。你可以看看它的设计。@geekgugi谢谢你,我会看看他们的REST层,这应该很有趣。他们正在使用spring AOP。谢谢,我想我实际上不需要那么糟糕的去耦合。我来看看RESTBucks的样品。