【问题标题】:Web Api Routing Multiple DTOs Same POCOWeb Api 路由多个 DTO 同一个 POCO
【发布时间】:2016-03-11 14:10:57
【问题描述】:

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

让我们想象以下场景:

  • 你有一个 POCO 类。假设有 100 个属性
  • 您需要在不同的平台/UI 中显示该类的列表

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

清单 2 提案 A21 |提案 A22 |提案 A23 |提案 A24 |提案 A25 |提案 A26 |提案 A27 |提案 A28 |

我将它称为公司,因为有很多使用这个类名的例子

这样实现Web API + DTOs策略是否正确?

类是:

  • 公司(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
}

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

【问题讨论】:

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


    【解决方案1】:

    我想说,您只需提供与特定 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。它将使您的控制器保持轻便。

    【讨论】:

    • 感谢 cmets。你认为这样的路由正确吗?是否符合 Restful 规范?
    • 关于这个话题有不同的看法。这是我通常参考的网站:restapitutorial.com。从那里您将大致了解您可以做什么。
    • 再次感谢您。正是我试图辩论/澄清的内容。我阅读了该示例以及您之前提到的许多其他示例,但我不确定路由。我会继续阅读。谢谢
    • @zx485 非常感谢您和所有其他人帮助和编辑问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多