对DTO的IQueryable投影 - 在这种情况下,自动播放器可以提供帮助吗?

时间:2015-10-28 15:54:24

标签: c# asp.net entity-framework asp.net-web-api repository-pattern

我正在查看我刚刚带来的项目的一些C#WebAPI代码,并注意到数据访问的一般模式是这样的:

  1. 控制器直接向存储库发出请求数据的呼叫。控制器的返回类型是IQueryable,其中T是DTO(不是实体)
  2. 存储库使用dbContext选择一个或多个实体(连接等),然后使用select进行投影以将其内联投射到相关DTO的iqueryable中。这些都是内联完成的,有时会占用大量的代码。
  3. 此IQueryable将返回给控制器,然后控制器将数据返回。
  4. 所以我在这里关注一些事情。首先,不应该使用像AutoMapper这样的东西来处理这个问题,这样每个特定的存储库都不会充斥着从一个(或几个)实体到一个DTO的这些相当大的投影?

    同样,请记住大部分时间,它不是一个实体(即User - > UserDto),而是几个实体映射到一个拼合的DTO。因此,例如Class1,Class2,Class3,Class4都映射到AggregatedClassDto。是否应该在存储库层完成,如果是这样,在这种情况下Automapper是否合适?

    如果我将映射逻辑移出其他地方,我认为这一切都将是自定义的(从属性/字段角度来看,几乎没有任何内容可以转换为1-1)。这不只是将所有代码移动到许多自定义转换器或什么?

    最后,还有其他任何关注领域?

    谢谢!

2 个答案:

答案 0 :(得分:2)

  

AutoMapper当然可以处理using AutoMapper.QueryableExtensions

即使您的类和属性不是一对一映射,也可以定义非常复杂的映射。您可以在AutoMapper Wiki上详细了解queryable extensions

就在存储库中完成映射而言,从single-responsibility的角度来看,您可能不应该在存储库中执行映射并返回实体。

答案 1 :(得分:0)

我将此作为单独的答案添加,因为我不完全同意第一个答案。

我同意不应在存储库内部进行映射,但我不同意所有映射都应由AutoMapper完成,因为DTOobject之间存在概念差异DTO,因为DTOs是一个数据传输对象,严格来说并不总是由您创建,因此不应该被信任。根据我的经验,最好手动将POCOs转换为window.onbeforeunload = function(){return "aaa";} 而不是自动转换它们(另一种方式,确定,继续)。 This blog-post quite well describes my opinion on the matter.