【发布时间】:2019-02-01 13:21:21
【问题描述】:
此 MSDN link 解释了为什么将 DTO 类用于 Web API 是一种很好的做法。这是可以理解的,让我困惑的是在同一个页面中,post 方法使用模型类而不是简单的 DTO 类,如下所示:
[ResponseType(typeof(BookDTO))]
public async Task<IHttpActionResult> PostBook(Book book)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Books.Add(book);
await db.SaveChangesAsync();
// New code:
// Load author name
db.Entry(book).Reference(x => x.Author).Load();
var dto = new BookDTO()
{
Id = book.Id,
Title = book.Title,
AuthorName = book.Author.Name
};
return CreatedAtRoute("DefaultApi", new { id = book.Id }, dto);
}
我想我的问题是:Post/Put 操作应该采用模型还是 DTO 参数?
更新: 从答案看来,即使在发布/放置操作的情况下,也建议使用 dto,但这会导致另一个问题,如何在发布操作的情况下从 dto 映射到模型类?假设我们使用 AutoMapper,我发现许多链接,例如 this 和 this 警告不要在反向映射中使用它(即 dto => Model 类)。
【问题讨论】:
-
方法参数应该采用DTO。然后将 DTO 翻译成对应的模型。
-
我同意这是一个不好的例子,您应该始终使用 DTO。创建新实体(如示例所示)可能是唯一的例外,但我不习惯也不建议这样做。
标签: c# asp.net-web-api asp.net-core .net-core dto