C# DTO的域模型属性

C# DTO的域模型属性,c#,asp.net-mvc,domain-driven-design,single-page-application,C#,Asp.net Mvc,Domain Driven Design,Single Page Application,使用DDD,如果我的域模型中有类似的内容: public class OrderLineItem { public decimal UnitPrice { get; set; } public int Quantity { get; set; } public decimal LineTotal { get { return UnitPrice * Quantity; } } } dto可以将LineTotal的属性设置为public decimal LineTotal

使用DDD,如果我的域模型中有类似的内容:

public class OrderLineItem {
    public decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
    public decimal LineTotal { get { return UnitPrice * Quantity; } }
}
dto可以将LineTotal的属性设置为
public decimal LineTotal{get;set;}
,这很好


假设我现在创建了一个作为SPA的UI。如果我想在向订单添加带有数量的行项目时显示行总数,我需要在dto/ViewModel/客户端重新创建计算,还是可以将域模型中的计算移动到服务(?)并从SPA调用它?这似乎更符合逻辑,但我不确定如何/在哪里编码。如果有人能给我举一个真正有帮助的例子。

当您试图执行某些业务逻辑时,会使用域模型。例如,在添加新的OrderLineItem时,您可能会检查是否满足某些业务要求,例如,所有OrderLineItem的总数不能大于N,或者OrderLineItem数量必须至少为N

此外,还可以存储计算的LineTotal。没有必要反复计算。您不希望客户在将商品放入购物篮后看到不同的LineTotal

当获取相同的OrderLineItem以在UI上显示它时,不需要检查所有业务规则,因为它们已经被检查过了。 因此,您可以使用一个单独的模型直接映射到您的表(或服务模型等)

我建议阅读更多关于CQR(命令查询责任分离)及其如何与DDD配合的内容

重读你的问题后,我发现我没有完整回答你的问题。 在我看来,您至少有两条路径,这两条路径都包括在某个点使用域模型

您可以通过在后端调用一些代码来计算总计,从而在前端完全添加OrderLineItem。我们可以将这段代码称为域服务。添加所有OrderLineItems并希望持久化它们之后,可以使用检查业务规则的域模型添加它们。由于UI需求,您可能不得不复制一些业务逻辑。这是不可避免的


第二种方法是第一种方法的变体,即在添加OrderLineItem后立即使用域模型。通过这种方式,使用我在前两段中描述的方法计算并返回Total。所有业务规则也会立即检查。

为什么要使用DTO?域模型应用于命令端。为什么不在添加行时尝试计算行总数,然后存储总数?那你就可以随便读了。我想说的是,您可以有两个模型,一个用于命令端(域模型),另一个用于读取端,即CQR。不太清楚您的意思。你是说要在域和“UI”模型中添加相同的计算吗?这很有道理,谢谢你的解释!