从控制器(表示层)内部映射域实体是否正确?

Is it correct to map a domain entity from within the controller (presentation layer)?

我在 Visual Studio 2015 年有一个解决方案,我将 DDD 层分离为项目。当我需要将数据从表示层(MVC 5)发送到应用层(class库)时,我通常使用:

应用服务

public interface IFooAppService
{
    void AddNew(string name, DateTime birthday);
}

控制器

[HttpPost]
public JsonResult AddNew(FooViewModel viewModel)
{
    FooAppService.AddNew(viewModel.Name, viewModel.birthday);
}

当我有一个包含许多属性和子实体的域实体 class 时,应用程序服务方法签名变得太长。考虑到 DDD 和关注点分离,在这种情况下,直接从 MVC 控制器将 FooViewModel class 映射到 Foo 域实体是否正确?这样的实现将是:

应用服务

public interface IFooAppService
{
    void AddNew(Foo foo);
}

控制器

[HttpPost]
public JsonResult AddNew(FooViewModel viewModel)
{
    Foo foo = FooMapper.Map(viewModel);
    FooAppService.AddNew(Foo);
}

如果您拥有的是从 DTO 到实体的简单映射,您可能正在构建 anemic domain model.

您应该尝试使用 DDD 构建成熟的域模型,或者求助于 CRUD 样式的应用程序。根据应用程序的性质,它们都有用。 DDD 通常只对复杂的问题域有意义。

is it correct to map the FooViewModel class to the Foo domain entity right from the MVC Controller in this case?

如果您有申请服务,我会拒绝。您费心创建一个额外的应用程序层,以便表示层可以专注于做 UI 事情而不是直接处理域。仅仅因为 "method signature is too long".

就想短路似乎很奇怪

此外,CQ(R)S 的命令概念可以帮助您解决该参数问题。控制器可以调用应用程序服务,只传递一个命令。