我应该在哪里设置CreatedDate,CreatedBy,ModifiedDate,ModifiedBy等字段?我应该将当前用户上下文传递给存储库并将其设置在那里,或者更好的方法是在应用程序服务中设置它(但是必须在每个API方法中完成而不是仅在存储库中的添加/更新中)?
答案 0 :(得分:6)
这取决于您的域名。
如果CreatedDate
,CreatedBy
...等值用于跟踪或记录目的,那么我会将它们放在Infrastructure
(存储库)中。
另一方面,如果这些值出于任何原因属于我的域,那么我将它们放在域层中。
示例:成像在银行转账环境中,客户可以在提交转账后24小时取消转账。然后域需要CreateTransferDate
来满足不变量。
另一个选项可能是一个使用所有域事件的侦听器,并保存所发生事件的历史时间数据。
答案 1 :(得分:0)
我更喜欢在存储库中设置它们。在名为int operatorId
的现有添加/更新方法或类似内容中添加一个参数。
如果您将代码放在应用程序服务中,则需要始终重复自己。如果您忘记设置某些值,则在保存更改时会抛出异常(有时甚至更糟,没有例外但是数据很脏)。
答案 2 :(得分:0)
我们总是在应用服务中设置实体状态。存储库用于保存数据,它们不应包含任何逻辑。域实体在应用程序服务中创建/修改,因此您可以在此处设置这些字段。创建/修改日期不应反映实体何时保存到数据库,而是实际保存/修改实体时。
此外,我们发现我们通常必须将我们的域实体映射到数据层实体,以便与底层数据库技术更友好。我们经常使用像automapper这样的工具来帮助我们自动化这些映射。在实体中具有等效数据实体中的字段会增加不必要的复杂性
答案 3 :(得分:0)
CreatedDate,CreatedBy,ModifiedDate和ModifiedBy通常是没有真实域值的概念,但它们更像是一个技术概念;这就是为什么我通常不在应用程序或域层中设置它们,而在存储库层中设置它们的原因。毕竟,存储库层是技术层。在一个域中,我不在乎这种信息。当然,除非它是无处不在的语言的一部分,但大多数情况下不是。
此外,如果ModifiedDate将成为域/应用程序的一部分,则您必须对每次操作进行设置,这将非常繁琐且容易出错。如果您在存储库中进行此操作,则将更加容易,因为每次更新时都进行此操作。
所以我会问一个问题:商业是否关心它?