C# 域驱动设计中每个实体的创建人、编辑人、创建日期、修改日期属性

C# 域驱动设计中每个实体的创建人、编辑人、创建日期、修改日期属性,c#,nhibernate,domain-driven-design,metadata,audit,C#,Nhibernate,Domain Driven Design,Metadata,Audit,我的应用程序中的每个实体都需要这些属性。如何使用DDD原则实现这一点 类似地,如果我希望管理员能够对每个实体发表评论,该怎么办 例如,您可以对所有嵌入审计的类使用公共层超类型。从EAA书籍的P: 层中的所有对象都有您不希望在整个系统中复制的方法,这种情况并不少见。可以将所有这些行为移动到公共图层超类型中 然后可以根据需要轻松地更新这些字段 另一种可能(可能更简洁)是将审计日志添加到存储库中,因为这些显然是基础设施方面的问题。特别是,如果“编辑者”用户在您的域中没有表示,而是应用程序的“用户” 例

我的应用程序中的每个实体都需要这些属性。如何使用DDD原则实现这一点


类似地,如果我希望管理员能够对每个实体发表评论,该怎么办

例如,您可以对所有嵌入审计的类使用公共层超类型。从EAA书籍的P:

层中的所有对象都有您不希望在整个系统中复制的方法,这种情况并不少见。可以将所有这些行为移动到公共图层超类型中

然后可以根据需要轻松地更新这些字段

另一种可能(可能更简洁)是将审计日志添加到存储库中,因为这些显然是基础设施方面的问题。特别是,如果“编辑者”用户在您的域中没有表示,而是应用程序的“用户”


例如,您的存储库实现可以存储审核日志(由命令创建、由命令修改)在数据库中的一个单独的审计日志表中。

为什么将
java
C
标记在一起?因为语法有些相似,如果有人需要提供一个示例,我很乐意使用这两种语言中的任何一种。概念在
java
C
中是相同的,而不是语法。我很清楚,但我会删除其中的一种语言,因为它似乎困扰着你。可以使用语言不可知的tagI最初是沿着layer super type路线走的,虽然我觉得它不是很干净,所以看看是否有其他选择。我也偶然发现了这样的东西:但有两个问题:1。所有my实体的标识符必须为GUID类型。2.某些实体只能由创建它们的作者编辑。我怀疑我真的只有一个选择,那就是层超类型路由,还是我不了解什么?有了实体框架,@Alexander Langer描述的方法可以通过在审计层超类型中声明审计字段来实现,所有实体都从中继承,然后覆盖DbContext.SaveChanges方法,为ChangeTracker标记为添加/更改的实体设置审核字段。如果使用NHibernate,类似的事情应该是可能的。这纯粹是基础设施问题。为什么没有更新这些字段的db触发器?使用EF 6,您可以使用拦截器设置会话的当前用户,并从触发器中访问该用户。