DDD:我应该在哪里设置修改日期并修改?存储库或应用程序服务?

时间:2016-06-17 09:06:18

标签: c# domain-driven-design

我应该在哪里设置CreatedDate,CreatedBy,ModifiedDate,ModifiedBy等字段?我应该将当前用户上下文传递给存储库并将其设置在那里,或者更好的方法是在应用程序服务中设置它(但是必须在每个API方法中完成而不是仅在存储库中的添加/更新中)?

4 个答案:

答案 0 :(得分:6)

这取决于您的域名。

如果CreatedDateCreatedBy ...等值用于跟踪或记录目的,那么我会将它们放在Infrastructure(存储库)中。

另一方面,如果这些值出于任何原因属于我的域,那么我将它们放在域层中。

示例:成像在银行转账环境中,客户可以在提交转账后24小时取消转账。然后域需要CreateTransferDate来满足不变量。

另一个选项可能是一个使用所有域事件的侦听器,并保存所发生事件的历史时间数据。

答案 1 :(得分:0)

我更喜欢在存储库中设置它们。在名为int operatorId的现有添加/更新方法或类似内容中添加一个参数。

如果您将代码放在应用程序服务中,则需要始终重复自己。如果您忘记设置某些值,则在保存更改时会抛出异常(有时甚至更糟,没有例外但是数据很脏)。

答案 2 :(得分:0)

我们总是在应用服务中设置实体状态。存储库用于保存数据,它们不应包含任何逻辑。域实体在应用程序服务中创建/修改,因此您可以在此处设置这些字段。创建/修改日期不应反映实体何时保存到数据库,而是实际保存/修改实体时。

此外,我们发现我们通常必须将我们的域实体映射到数据层实体,以便与底层数据库技术更友好。我们经常使用像automapper这样的工具来帮助我们自动化这些映射。在实体中具有等效数据实体中的字段会增加不必要的复杂性

答案 3 :(得分:0)

CreatedDate,CreatedBy,ModifiedDate和ModifiedBy通常是没有真实域值的概念,但它们更像是一个技术概念;这就是为什么我通常不在应用程序或域层中设置它们,而在存储库层中设置它们的原因。毕竟,存储库层是技术层。在一个域中,我不在乎这种信息。当然,除非它是无处不在的语言的一部分,但大多数情况下不是。

此外,如果ModifiedDate将成为域/应用程序的一部分,则您必须对每次操作进行设置,这将非常繁琐且容易出错。如果您在存储库中进行此操作,则将更加容易,因为每次更新时都进行此操作。

所以我会问一个问题:商业是否关心它?