属性值更新的最佳/逻辑实践(控制器或服务层?)

时间:2017-02-02 04:52:34

标签: c# asp.net design-patterns architecture

我的项目有Web API控制器,服务和存储库。 Controller得到了一个更新方法,如:

 public IActionResult Update(CreateCollaboratorViewModel collaboratorViewModel)
    {
       //Is it good to set values here in Controller or in Service layer ?

        AdminCollaborators collaborator = new AdminCollaborators();
        collaborator.Description = collaboratorViewModel.Description;
        collaborator.ModifiedBy = _myContext.CurrentUserId;
        var output = _collaboratorService.UpdateCollaborator(collaborator, _myContext.CurrentUserId);
        return Ok(new WebApiResultValue(true, output, "update successful."));
    }

服务

 public AdminCollaborators UpdateCollaborator(AdminCollaborators collaborator, Guid actorUserId)
    {
        collaborator.ModifiedBy = actorUserId;
        collaborator.ModifiedOn = DateTimeHelper.Instance.GetCurrentDate();
        _collaboratorRepository.UpdateCollaborator(collaborator,actorUserId);
        return _collaborationRepository.SaveChanges();
    }

通常,服务应该实现业务逻辑(如果我没有错)。如果我更新Controller或Services中的属性值,请提供建议。

由于

1 个答案:

答案 0 :(得分:0)

这是实施DDD-ish architctures的常见结果。当域太简单时,最终会有许多层执行相同的操作,每个层都有或多或少的抽象级别。

顺便说一下,你走这条路是因为你已经确定有一天你会想要把更复杂的东西放在正确的地方。否则,你需要做一个大规模的重构,把一个非分层的项目变成一个n层的项目。

无论如何,应该在服务层进行更新。您的服务层可能如下所示:

collaboratorService.Update(collaboratorId, updateCollaboratorDto);

updateCollaboratorDto应该是 DTO ,其中应包含您要在域对象上更新的数据。

截至 DTO 域对象之间的映射,您应该使用 AutoMapper 自动映射它们。

请注意,您正处于WebAPI / RESTful API世界中,而您正在谈论视图模型。我会重命名将 ViewModel sufix替换为 Dto