存储库层是否应该返回数据传输对象(DTO)?

问题描述 投票:23回答:2

我有一个存储库层负责我的数据访问,由服务层调用。服务层返回序列化并通过线路发送的DTO。通常,服务只是访问存储库并返回存储库返回的内容。

但要使其工作,存储库必须返回该DTO的实例。否则,您首先必须将存储库返回的数据层对象映射到服务层中的DTO并返回该对象。这看起来很浪费。

最重要的是,如果DTO的创建发生在服务层中,那么在一个存储库调用之前可能已经完成的事情以及因此一个数据库查询现在必须在服务层中的多个存储库调用发生以“组合”最终的DTO。当然,除非我在数据和服务层之间创建一个可以包含这样一个组合对象的传输对象。然后必须将其映射到DTO。为了纯洁,这似乎是浪费。但是,让存储库层返回仅通过线路发送的对象也是错误的。

c# data-access-layer n-tier-architecture dto service-layer
2个回答
15
投票

简答:不。

答案很长:存储库负责将持久数据转回实体(模型),反之亦然。

Model是表示业务实体的业务模型。另一方面,DTO - 虽然看起来像模型 - 关注在各种环境之间传递对象,实质上是一个瞬态对象。通常,映射器负责将模型转换为DTO。


-1
投票

那么即使它没有被使用,你的存储库也需要保护整个实体?这看起来非常低效。 - ajbeaven 18年10月29日23:25

难道您无法为存储库接口添加方法,以便不需要对整个实体进行水合作用吗?我想这可能导致膨胀的界面,这是我认为的主要论据之一。

为了回答这个问题,我同意接受的答案。存储库实现在持久层中。域层可能需要从持久层中检索深层或浅层对象,除了它必须实现的接口之外什么都不知道。如果域只需要一个完整的冰箱,只需要黄油,那么接口(或者数据模型)可能需要一些工作。

© www.soinside.com 2019 - 2024. All rights reserved.