DDD :( Domain和ViewModel)=>常见行为

时间:2013-12-01 10:01:55

标签: c# asp.net-mvc domain-driven-design asp.net-mvc-viewmodel

我是DDD的新手,我不知道如何处理应该在ViewModel中完成的域的常见行为。

说我有一个Order.Ship(),应该在输入数据时完成。看来这个操作应该由我的ViewModel完成(数据录入时)。

我正在用DTO包裹ViewModel并且每个DTO都来自ApiController,我应该将Ship()放在Order Entity内吗? }或ViewModel

当我将状态移至Domain Behaviors时,ViewModel的用法是什么?

我是在真正的骑行吗?

1 个答案:

答案 0 :(得分:2)

  

我是DDD的新手,我不知道如何处理应该在ViewModel中完成的域的常见行为。

不,域行为应保留在域中,不应泄漏到其他层。特别是对UI。

  

说我有一个Order.Ship(),应该在数据输入时完成。看来这个操作应该由我的ViewModel完成(数据录入时)。

ViewModel只是一个DTO,除了格式化视图数据,验证数据等之外,不应该有其他逻辑。所以不,不应该在ViewModel中调用域逻辑。您应该拥有一种位于UI和域层之间的应用程序服务层(它不是必需的,但通常会增加更清晰的职责分离)。此应用程序层可以承担交叉切割问题,例如Logging,Tranasactions等。通常,此应用程序层由“Shipping Order”等业务用例组成,您可以在其中调用业务逻辑Order.Ship()。如果你没有这个应用层,那么ApiControllers的角色就是负责。

  

我正在通过ViewModel包装DTO并且每个DTO都来自ApiController,我应该将Ship()放在Order Entity还是ViewModel中?

如果Ship()方法是域逻辑,则它应该位于域实体或域服务上。

  

在我将状态移至ViewModel时,域行为的用法是什么?

我认为您的意思是通过查询域的状态将状态移动到ViewModel。即使我认为查询主要针对“命令”而非查询而设计的域模型也不是一个好主意。但是,如果您这样做,ApiController(或应用程序服务,如果您有的话)负责将域的状态“转换”为ViewModels(DTO)。