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
复制到实体
就足以让域
了解状态的变化