- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想在这里找到两个非常相似的问题的答案:
Should I convert an entity to a DTO inside a Repository object and return it to the Service Layer?
或
Is it okay to return DTO objects from the Repository Layer?
现在我卡在我的 Servlet(Servie 层)中,例如尝试从 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 服务,它只能返回与客户端和服务器共享的 DTO。
因此,在一个非常简单的服务器端设置中,您有一个数据库后端,通过作为持久层的 hibernate 访问数据,以及作为休息服务的服务层。在这样的设置中,您的 hibernate 实体在整个服务器端代码之间共享。例如,您的服务层正在将实体转换为 json 格式。成交?
您的“高级”设置
Repository-Layer 的定义:在我看来,它是对不同数据/持久层的抽象。它不提供业务逻辑,这更多的是进一步业务层的目的。业务层将上层的输出汇总在一起,进行计算并返回结果。但是根据您的评论来看,您的存储库层也可能是这种情况。但我们可以澄清一下。
您的问题:是否可以从存储库层返回 DTO 对象?
回答:不,从“存储库”层返回 DTO 并不是真的好。
原因: 1. 您的 DTO 是一个转换为可以发送到客户端的格式的域实体。它有一些限制,因此无法在其中使用某些服务器端库。 2.考虑你还想提供其他服务层的情况。可能是一个 REST 接口(interface),也可能是另一个 GUI 框架。它们在传输域实体方面都有自己的局限性。您真的要为每个服务层复制存储库层吗? 3. 考虑您想要扩展您的存储库/业务层以便它使用您的RestaurantOwnerRepository
的输出的情况。您真的想在那里从事 DTO 方面的工作吗?
这就是为什么创建 DTO 是服务层的目的。因此,DTO 在客户端和您的服务层之间共享。同样,您需要在服务层和存储库层之间共享的对象。我称这些领域实体。这些从存储层返回并由服务层使用。存储层和持久层之间同样如此。例如,持久层返回在存储层上使用的 Hibernate 实体。
在大多数情况下,可以将对象从多层向下传播。因此,您可以将您的 hibernate 实体从存储库层返回到服务层。较新版本的 GWT 甚至允许通过特殊设置在客户端使用 JPA 实体。因此您的服务层可以进一步返回您的持久化实体。
关于java - 我应该将一个实体转换为 Repository 对象中的 DTO 并将其返回给服务层吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31743017/
我看到 DTO 类型在域模型中的类型内创建并在类型之间传递。这是好习惯吗? 我一直认为 DTO 主要用于上下文边界(即对象图的边缘)以解耦上下文实现(例如域/ui 边界)。 最佳答案 你的问题有点主观
我们将使用 DTO 向表示层发送数据或从表示层发送数据。我们有这样的层: 外观 应用服务 域名 我们使用 Dozer 来帮助我们将实体转换为 dto。但我现在有两个问题: 从entity到dto我们可
我对术语有疑问。根据 Fowler 的说法,DTO 是“在进程之间传输数据以减少方法调用次数的对象”。 (http://martinfowler.com/eaaCatalog/dataTransfer
我们使用 spring-boot 开发的应用程序遵循微服务架构。为了解释这个问题,让我们考虑 3 个不同的服务 A、B、C。服务 A 和 B 也使用服务 C 的一些 API。 我在项目 C(服务 C)
所以基本上我正在编写一个使用 DTO 的 API,但我在返回 DTO 内的另一个实体时遇到了问题。 这是我的 DTO: public class DirectoryDTO { String per
我尝试从方法响应正文中获取派生类字段。请求体参数是基类的类型。请求带有派生类字段,但我无法将其转换为派生类。 这是我的 Controller 方法和 DTO 类: 方法: @PostMapping(
这更多的是一个理论问题,而不是一个实际问题。 我们有一个分层架构,类似于: UI UI_JavaHandler Backend DTO1 需要比 DTO2 多一点的数据,并且恰好是一个额外的字符串
我在 Wildfly 10.1.0-Final 上使用带有 Java 8 和 Hibernate (5.0.X) 的 Java EE 7,我需要使用投影将 JPQL 查询结果加载到 DTO 中,但我找
有一个建议是transfer objects should not contain object references to other transfer objects .相反,他们应该使用其他传输
我们正在开始一个新项目并正在设计 DTO,这些 DTO 将被注入(inject)到具有行为的相应 POCO 中。然而,我能找到的每个 DTO 示例都只包含值类型,例如: public class Cu
这可能是一个一般的java问题 DTO1 属性1 属性2 属性3 DTO2 属性1 属性2 属性3 属性4 属性5 属性6 属性7 属性8 属性9 属性10 属性11 属性12 我将在屏幕上的 gxt
我在一个项目中遇到了一个问题,并在一个裸测试项目中成功地重现了它。 我有以下 dto: public class AppUserDto { public int Id { get; set;
我正在研究 RESTful API,但在为 API 提供输入的过程中遇到了一些麻烦。 假设我有一个可以像这样获取的“人”资源:api/person/{id}并返回一个这样的对象: public cla
我正在使用 DTO 构建我的第一个应用程序 - 我目前有一个 DTO 用于获取特定对象的数据,另一个不同的 DTO 用于更新(PUTting)数据 - 因为只有少数字段可以从任何客户端更新,我决定为
private void writeData(HSSFSheet sheet) { for (int i = 0; i 并动态获取 DTO 属性值?,我们在Stack Overflo
我正在尝试使用 Jackson 和 Kotlin 将 YAML 文档映射到复杂的 DTO 结构,但似乎在某处遇到了误解。 我正在解析的 YAML 文档是 item_names: - item:
这个问题在这里已经有了答案: How to efficiently create a list of objects inside of a generic method? (2 个答案) 关闭 9
我们将使用 DTO 向表示层发送数据或从表示层发送数据。 我在名为 PostAd 的服务对象上有一个方法,它发布用户输入的广告。 Ad 与另一个名为 AdValues 的对象相关联,该对象包含 Ad
我的应用程序服务中有验证逻辑,用于确定请求的操作是否成功,如果没有,原因。我质疑这是否是代码异味,因为它在应用程序服务中而不是域服务中,它围绕检查域模型是否存在、dto 中的属性是否可以为空等展开。代
我有以下域模型: public class Playlist { public long Id { get; set; } public string Title { get; set
我是一名优秀的程序员,十分优秀!