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

Jul*_*anR 25 c# data-access-layer dto n-tier-architecture service-layer

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

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

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

Ali*_*tad 16

简答:不.

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

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

  • 好吧,如果我想要纯粹,我会让我的存储库返回一个实体(数据模型),服务层然后映射到DTO并通过网络发送它?对于更复杂的查询,服务和数据层之间的专用传输对象如何避免必须进行多个查询? (5认同)
  • 因此,即使您的存储库没有被使用,您的存储库也需要对整个实体进行水合吗?这似乎非常低效。 (3认同)

小智 5

\n

那么您的存储库需要水合整个实体,即使它没有被使用?这看起来效率很低。\xe2\x80\x93 ajbeaven 2018-10-29 23:25

\n
\n\n

您不能向存储库接口添加方法来进行不需要水合整个实体的调用吗?我认为这可能会导致界面臃肿,我认为这是反对的主要论点之一。

\n\n

为了回答这个问题,我同意“否”的公认答案。存储库实现位于持久层中。领域层可能需要从持久层检索深层或浅层对象,持久层除了必须实现的接口之外一无所知。如果域在只需要黄油时不断要求装满冰箱,那么接口(或者数据模型)可能需要一些工作。

\n