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

时间:2011-02-21 17:12:31

标签: c# data-access-layer n-tier-architecture dto service-layer

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

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

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

2 个答案:

答案 0 :(得分:14)

简短回答:不。

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

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

答案 1 :(得分:-1)

  

因此,即使没有使用您的存储库,也需要对整个实体进行水合处理?这似乎效率很低。 – ajbeaven 18年10月29日在23:25

是否可以将不需要添加整个实体的调用的方法添加到存储库接口中?我想这可能导致接口过大,这是我认为反对的主要论据之一。

要回答这个问题,我同意接受“否”的答案。存储库实现在持久层中。域层可能需要从持久层检索深层或浅层对象,而持久层除了必须实现的接口外一无所知。如果域仅在需要黄油时就不断要求一台完整的冰箱,那么也许接口(或数据模型)需要一些工作。