可以爲GET和POST操作使用不同的DTO嗎?WebApi不同的DTO獲取和發佈
原因是這兩個數據模型之間通常存在巨大差異。
例如:
我的帖子是這樣的:
/// <summary>
/// Add new user
/// </summary>
/// <param name="item">User data</param>
/// <returns>Newly added user id</returns>
[HttpPost]
public IHttpActionResult Post([FromBody] UserDto item)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var model = _mapper.Map<User>(item);
int itemid = _usersRepository.Insert(model);
return Ok(itemid);
}
public class UserDto
{
private string _password;
[Required]
[StringLength(100, ErrorMessage = "Name {0} must consist of at least {2} letters.", MinimumLength = 6)]
public string Name { get; set; }
[Required]
public string ExternalName { get; set; }
[Required]
public bool Active { get; set; }
[Required]
public string Password
{
get { return _password; }
set { _password = value.Hash(); }
}
}
和我的GET應該是這樣的:
/// <summary>
/// Get all users
/// </summary>
/// <returns>Users list</returns>
[HttpGet]
[ResponseType(typeof(List<UserInfoDto>))]
public IHttpActionResult Get()
{
IList<UserInfoDto> values = _usersRepository.SelectAll();
if (values == null || !values.Any())
return Ok();
return Json(new { collection = values });
}
public class UserInfoDto
{
public int Id { get; set; }
public string Name { get; set; }
public string ExternalName { get; set; }
public bool Active { get; set; }
}
我應該這樣做的原因是,我在發佈資源時不需要Id,但需要密碼。在使用GET時反過來。
這是使用WebApi(爲響應和請求創建不同的Dtos)的正確方法嗎?或者有其他方法可以做到這一點嗎?
是否這是正確的方法是一個意見。公開或接受系統按預期執行的必要信息。每個動作都可以使用自己的dto。並不意味着它應該。 – Nkosi
如果您使用映射技術,則可以修改dto的映射以符合您的標準。 –