我需要在DTO中应用业务规则,但此DTO具有N个实体的属性。
我想知道验证此DTO的正确方法。
答案 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)构建相同的域对象,产品
此模式通常与方法链接一起使用,并导致流畅的界面。