如何在DTOs DDD中应用业务规则

时间:2017-02-04 12:14:36

标签: domain-driven-design business-rules

我需要在DTO中应用业务规则,但此DTO具有N个实体的属性。

我想知道验证此DTO的正确方法。

3 个答案:

答案 0 :(得分:0)

非常常见的方法是将DTO包装到实体中并在实体内部实现业务规则。

var state = new DTO();
var entity = new Entity(state);

//this will change the state in a consistent way according to business rules
entity.DoSomething1();
entity.DoSomething2();

//this is C#, so I can't get immutable version easily, but if your language allows that - you should return immutable state from entity. Or you can return a clone of the state
state = entity.State;

//store or do whatever you like with the state as long as you keep it immutable.
_repository.Save(state); 

答案 1 :(得分:0)

由于DTO只是一个数据传输对象,因此不应在其中应用任何业务逻辑。

  

DTO具有N个实体的属性

最好的方法是为您的案例创建一个聚合类,并在其中应用业务逻辑。

<td (input)="onRowClick($event, invoice.rowId)">
    <div [contenteditable]="invoice.editable ? 'true': 'false'">{{ invoice.rowName }}</div>
</td>

值得注意的是,DDD的一个想法是防止创建无效对象。因此,您应该保证,如果已创建域实体,则它是有效的,并且始终可以创建DTO。业务逻辑仍然是负责DTO创建的层的黑盒子

答案 2 :(得分:0)

正如其他答案中所述:

  

您的DTO中不应该有业务规则。

虽然主题是DDD,但确保您始终创建有效域对象的另一种常用方法是使用Builder Pattern

此模式允许您改变产品的表示形式。例如,软件可能有一个名为 Product 的域,但是 - 在现实世界中表示 - 它可能是服务材料(I可以出售手机或手机保险),因此必须创建两个构建器( MaterialBuilder ServiceBuilder ,用于ie)构建相同的域对象,产品

此模式通常与方法链接一起使用,并导致流畅的界面

相关问题