Web Api路由多个DTO相同的POCO

时间:2016-03-11 14:10:57

标签: asp.net-mvc asp.net-web-api asp.net-web-api2 dto asp.net-web-api-routing

当您对同一POCO有多个DTO时,我对如何实现Web API路由存在疑问。

让我们想象以下场景:

  • 你有一个POCO课程。让我们说100个属性
  • 您需要在不同平台/ UI中显示该类的列表

即。

  

列表1道具A1 |道具A2 |道具A3 |支柱A4

     

清单2道具A21 |道具A22 | Prop A23 |道具A24 |道具A25 |道具A26 |道具A27 | Prop A28 |

我将其称为公司,因为有许多使用此类名称的示例

实施像这样的Web API + DTO策略是否正确?

课程是:

  • 公司(POCO类)
  • CompanyDetailDTO
  • CompanyLightListDTO
  • CompanyMediumListDTO

示例:

public class CompaniesController : ApiController
{
    private MultiTierWebApiContext db = new MultiTierWebApiContext();

    private static readonly Expression<Func<Company, CompanyDetailDTO>> AsCompanyDetailDTO =
         x => new CompanyDetailDTO
         {
             Name = x.Name,
             Email = x.Email,
             isCustomer = x.isCustomer,
             isSupplier = x.isSupplier,
             Id = x.Id
         };

    private static readonly Expression<Func<Company, CompanyMediumListDTO>> AsCompanyMediumListDTO =
        x => new CompanyMediumListDTO
        {
            Name = x.Name,
            Email = x.Email,
            Id = x.Id
        };

    private static readonly Expression<Func<Company, CompanyLightListDTO>> AsCompanyLightListDTO =
        x => new CompanyLightListDTO
        {
            Name = x.Name,
            Id = x.Id
        };

    // GET: api/Companies/LightList
    [Route("api/Companies/LightList")] **It works, but is this a correct way to do it?**
    [ResponseType(typeof(CompanyLightListDTO))]
    public IQueryable<CompanyLightListDTO>GetCompaniesLightList()
    {
        return db.Companies.Select(AsCompanyLightListDTO);   // default
    }

    // GET: api/Companies/MediumList
    [Route("api/Companies/MediumList")]
    [ResponseType(typeof(CompanyMediumListDTO))]
    public IQueryable<CompanyMediumListDTO> GetCompaniesMediumList()
    {
        return db.Companies.Select(AsCompanyMediumListDTO);   // default
    }

// remaining code removed for simplicity
}

提前感谢您提供进一步的帮助。

1 个答案:

答案 0 :(得分:0)

我会说你走在正确的轨道上,只提供与特定DTO相关的相关信息。不要提供超出必要的数据。

如果您查看以下演练,您将看到它们如何遵循与示例中的模式类似的模式。 Create a REST API with Attribute Routing in ASP.NET Web API 2

引用参考:

  

相反,我希望此请求返回字段的子集。还有,我   希望它返回作者的名字,而不是作者ID。至   实现这一点,我们将修改控制器方法以返回数据   转移对象(DTO)而不是EF模型。 DTO是一个对象   仅用于携带数据。

// Typed lambda expression for Select() method.
private static readonly Expression<Func<Book, BookDto>> AsBookDto =
    x => new BookDto
    {
        Title = x.Title,
        Author = x.Author.Name,
        Genre = x.Genre
    };

// GET api/Books
public IQueryable<BookDto> GetBooks()
{
    return db.Books.Include(b => b.Author).Select(AsBookDto);
}

我的建议是将转换/投影功能从控制器(SoC)分离到他们自己的服务(SRP)中,并将它们(DI)注入ApiController。这将使您的控制器保持轻盈。