当您对同一POCO有多个DTO时,我对如何实现Web API路由存在疑问。
让我们想象以下场景:
即。
列表1道具A1 |道具A2 |道具A3 |支柱A4
清单2道具A21 |道具A22 | Prop A23 |道具A24 |道具A25 |道具A26 |道具A27 | Prop A28 |
我将其称为公司,因为有许多使用此类名称的示例
实施像这样的Web API + DTO策略是否正确?
课程是:
示例:
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
}
提前感谢您提供进一步的帮助。
答案 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。这将使您的控制器保持轻盈。