我应该将实体转换为Repository对象中的DTO并将其返回给服务层吗?



我在这里试图得到两个非常相似的问题的答案:

我应该将实体转换为存储库对象中的DTO并将其返回给服务层吗?

是否可以从存储库层返回DTO对象?

现在我被困在我的Servlet(服务层),例如试图从RestaurantOwnerRepository检索所有Restaurant对象:

// RestaurantOwnerService (Servlet)
@Override
@Transactional
public List<RestaurantDTO> getAvailableRestaurants() {
    List<Restaurant> availableRestaurants = restaurantOwnerRepository.getRestaurants(getSessionId());
    return null;
}

其中Restaurant是一个@Entity注释类-这似乎是我不应该做的第一件事,因为服务层现在知道一个非常低级的对象,这违反了在每层抽象我的数据的尝试。

如果我将每个Restaurant转换为RestaurantDTO,情况就不是这样了-但我应该这样做吗?

主要变化:

// RestaurantOwnerRepository
@Override
public List<Restaurant> getRestaurants(String sessionId) {
    RestaurantOwner restaurantOwner = this.get(sessionId);
    // .. getting restaurants ..
    return availableRestaurants;
}

// RestaurantOwnerRepository
@Override
public List<Restaurant> getRestaurants(String sessionId) {
    RestaurantOwner restaurantOwner = this.get(sessionId);
    // .. getting restaurants ..
    return ConvertEntity.convertRestaurants(availableRestaurants);
}

并为每个实体设置一个util ConvertEntity,例如:

public class ConvertEntity {
    public static List<RestaurantDTO> convertRestaurants(List<Restaurant> restaurants) {
        // ...
    }
}

但这对我来说不是最好的解决方案…我在这里能做些什么呢?


需要提到的一件重要的事情是来自GWT项目。这意味着我在服务器和客户端使用例如RestaurantDTO,因为它包含在共享项目中。

看了你的评论,现在更清楚了。让我们再试一次:

首先,一些澄清:您的RestaurantOwnerRepository实现了存储库模式。您的@Entity注释对象是hibernate实体,也是DAO代理。你的RestaurantOwnerService是一个GWT-Service,它只能返回一个与客户端和服务器共享的DTO。

因此,在一个非常简单的服务器端设置中,您有一个db后端,通过hibernate作为持久层访问数据,而服务层作为rest-service。在这种设置中,您的hibernate实体在整个服务器端代码之间共享。例如,您的服务层正在将实体转换为json格式。交易吗?

你的"高级"设置

  • 持久层
    • 与Hibernate(交付@Entity-Annotated对象)
    • 可能还有其他东西
  • 存储库层(不清楚要返回什么)
  • 服务层(GWT servlet,提供与客户端共享的dto)

存储库层的定义:在我看来,它是不同数据/持久层的抽象。它不提供业务逻辑,而业务逻辑更多的是进一步的业务层的目的。业务层将上层的输出编译在一起,进行计算并返回结果。但是根据您的评论,在您的存储库层中也可能是这种情况。但我们澄清一下是可以的。

你的问题:是否可以从存储库层返回DTO对象?

答案:不,从"存储库"层返回DTO是不正确的。

原因: 1。您的DTO是一个转换成可以发送到客户端的格式的域实体。它有一些限制,因此一些服务器端库不能在其中使用。2. 考虑您还希望提供其他服务层的情况。也许是rest接口,也许是另一个gui框架。它们在转移域实体时都有自己的限制。您真的想为每个服务层复制存储库层吗?3.考虑这样一种情况:您希望扩展存储库/业务层,以便它使用RestaurantOwnerRepository的输出。你真的想在那里做dto吗?

这就是为什么创建DTO是服务层的目的。因此,DTO在客户端和服务层之间共享。同样,您需要在服务层和存储库层之间共享对象。我称这些为领域实体。这些从存储库层返回并由服务层使用。存储库层和持久层之间也是如此。例如,持久层返回在存储库层上使用的Hibernate实体。

在大多数情况下,从多个层向下传播对象是可以的。因此,您可以将hibernate实体从存储库层返回到服务层。新版本的GWT甚至允许通过特殊设置在客户端使用jpa实体。因此,您的服务层可以进一步返回您的持久性实体。

最新更新