ASP.NET多个DTO到一个模型并在DTO中进行验证

时间:2017-10-29 15:13:30

标签: c# asp.net asp.net-mvc dto

在我的网络应用程序中,我有许多属性的课程。用户可以使用一组选择框修改这些属性,每个选择框负责一个属性。每次更改给定属性时,都会触发更改事件,并且ajax会将此属性的新值发送到Controller中的Update方法。

到目前为止,我有一个由可空字段组成的UpdateDto。在我的Update控制器中,我检查每个DTO的字段是否为空。如果它不为null,则表示用户想要更改此属性,并将其更新并保存在数据库中。

不幸的是,Update方法的代码对我来说有点难看。它检查每个属性,它很长。看看:

控制器中的更新方法:

public IHttpActionResult UpdateScrumTask(int id, ScrumTaskDetailsDto scrumTaskDto)
{
var scrumTaskFromDb = _context.ScrumTasks
    .SingleOrDefault(s => s.Id == id);

if (scrumTaskFromDb == null)
    return NotFound();

if (!ModelState.IsValid)
    return BadRequest();

if (!string.IsNullOrWhiteSpace(scrumTaskDto.UserId))
{
    var user = _context.Users
        .SingleOrDefault(u => u.Id.Equals(scrumTaskDto.UserId));

    scrumTaskFromDb.UserId = user?.Id;
}
else if (scrumTaskDto.EstimationId != null)
{
    var estimation = _context.Estimations
        .SingleOrDefault(u => u.Id == scrumTaskDto.EstimationId.Value);

    scrumTaskFromDb.EstimationId = estimation?.Id;
}
else if (scrumTaskDto.Priority != null)
{
    if (scrumTaskDto.Priority.Value == 0)
        scrumTaskDto.Priority = null;

    scrumTaskFromDb.Priority = scrumTaskDto.Priority;
}
else if (scrumTaskDto.TaskType != null)
{
    scrumTaskFromDb.TaskType = scrumTaskDto.TaskType.Value;
}

_context.SaveChanges();

return Ok();
}

UpdateDTO:

public class ScrumTaskDetailsDto
{    
    public int? EstimationId { get; set; }

    [Range(0, 5)]
    public byte? Priority { get; set; }

    [Range(0, 2)]
    public TaskType? TaskType { get; set; }

    public string UserId { get; set; }
}

请注意,这些属性在数据库中也可以为空。这就是为什么如果没有找到UserId,数据库中的属性被设置为null。

我想知道它应该是什么样的。什么是更好的解决方案

  • 保留一个Update方法,并使用一个具有许多可空字段的UpdateDto或
  • 将Devide Update方法分解为许多方法,每个方法负责一个属性并创建单独的DTO。它带来了很多DTO与一个具有单一属性的模型相关联(这样好吗?)

另一个问题是: 我应该在DTO中使用validtion(DataAnnotation)吗?如果没有,什么是替代解决方案?

1 个答案:

答案 0 :(得分:2)

我建议进行一些改进:

  1. 使用像MediatR这样的库,使用存储库模式或查询和命令对象将查询逻辑与核心业务逻辑分开,控制器只应调用其他方法为其执行某些操作并返回响应,它不应该是有任何查询或任何其他逻辑
  2. DTO对我来说没问题,只要它围绕一个特定的任务
  3. 我肯定会将更新与控制器分开,因为它是一种或多种方法,它的35 ...行,这是不理想的,也许你可以把它分成两个方法,一个负责验证还有一个负责实际更新的人,也可以使用依赖注入将更新和验证方法与控制器分离