C# DDD:(域和视图模型)=>;常见行为

C# DDD:(域和视图模型)=>;常见行为,c#,asp.net-mvc,domain-driven-design,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Domain Driven Design,Asp.net Mvc Viewmodel,我不熟悉DDD,我不知道如何处理域的常见行为,这些行为应该在ViewModel中完成 假设我有一个Order.Ship(),这应该在数据输入时完成。似乎此操作应该由我的ViewModel(在输入数据时)完成 我用ViewModel包装DTO,从ApiController获取的每个DTO,我应该将Ship()放在订单实体内还是ViewModel内 当我将状态移动到ViewModel时,域行为的用法是什么 我真的在骑马吗 我是DDD新手,不知道如何处理域的常见行为,这些行为应该在ViewModel中

我不熟悉
DDD
,我不知道如何处理域的常见行为,这些行为应该在
ViewModel
中完成

假设我有一个
Order.Ship()
,这应该在数据输入时完成。似乎此操作应该由我的
ViewModel
(在输入数据时)完成

我用
ViewModel
包装
DTO
,从
ApiController
获取的每个
DTO
,我应该将
Ship()
放在
订单实体
内还是
ViewModel

当我将状态移动到
ViewModel
时,
域行为的用法是什么

我真的在骑马吗

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

不,域行为应该留在域中,并且永远不应该泄漏到其他层。尤其是对UI

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

ViewModel只是一个DTO,除了为视图格式化数据、验证数据等之外,不应该有其他逻辑。因此,不应该在ViewModel内部调用域逻辑。相反,您应该有一种应用程序服务层(它不是强制性的,但通常会添加更清晰的职责分离),它位于UI和域层之间。此应用程序层可以承担跨领域的责任,如日志记录、事务处理等。通常,此应用程序层由“Shipping Order”等业务用例组成,在这些用例中,您可以调用业务逻辑
Order.Ship()
。如果您没有这个应用程序层,那么由APIController负责

我用ViewModel包装DTO,每个DTO都是从ApiController获得的,我应该将Ship()放在Order实体或ViewModel中吗

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

当我将状态移动到ViewModel时,域行为在这里有什么用途


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

计算薪资很可能是业务逻辑,应该在域中完成,而不是在视图中。如果您在ViewModel中计算它,那么您使用的是一个智能UI,这可能是您想要避免的。@Alexander Langer:刚刚编辑过的Hanks,在这种方法中有没有更简单的方法来最小化对
ApicController
s的调用?(因为我可以在没有客户端/服务器调用的情况下实现)您的意思是什么?ApiController位于用户/机器边界(交互)的前面。所以,如果你想最小化调用,你必须使用缓存,这是实现Restful服务的好方法。我的意思是,一些操作可以在客户端完成,而无需调用
服务器端服务
(我的客户端应用程序是
WPF
)并影响其
视图模型
DTO
的状态,然后将其传递给
服务器端服务
,然后
服务器端服务
将更改应用于
实体
。在这种情况下,
DTO
的状态更改为“调用服务器端服务的结果”应该为我们做什么,将
DTO
复制到
实体
就足以让
了解状态的变化