NHibernate,审计和计算列值

4

如何在NHibernate更新/插入实体时设置一些特殊的列值,而不需要通过扩展域类来添加特殊属性?

例如,每个表都包含像CreatedBy、CreatedDate、UpdatedBy、UpdatedDate这样的审计列。但我不想将这些属性添加到域类中。我希望尽可能地保持域模型的持久性无关因素。

5个回答

1
经过几个小时的NHibernate破解,我找到了一个妥协的解决方案,可以使领域层类与基础设施层隔离开来。下面列表中唯一的“受害者”是点#1:
1)我为领域中所有可持久化实体引入了基类DomainObject,该类只有一个私有字段:
private IDictionary _infrastructureProperties = new Dictionary<object, object>();

2) 在类映射中添加了以下部分:

<dynamic-component name='_infrastructureProperties' access='field'>
  <property name='CreateBy' column='CreatedBy' />
  <property name='CreateDate' column='CreatedDate' />
</dynamic-component>

3)实现了一个拦截器,该拦截器设置这些属性的值。

4)可选。我们还可以实现一种配置方式,用于指定每个类在应用程序中所扮演的“角色”,然后在拦截器中使用特定于角色的属性。例如,此配置可能表明Product是TenantScopeObject,并且拦截器将设置名为TenantID的属性,其值为当前租户标识已登录系统。


一些拦截器的源代码会非常有帮助。 - JC Grubbs

1

1

0

0

这与"不添加这些属性"不同,但是上次我看到工程师解决了这个问题,通过实现具体的 NHibernate 类并从一个共同的抽象基类(例如 MyAuditable)派生它们来解决。这个抽象基类实现了你不喜欢的属性。这样,你只需要解决一次这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接