如何通过NHibernate更新/插入实体时设置一些特殊的列值,而无需扩展具有特殊属性的域类?NHibernate,审计和计算列值
E.g.每个表都包含像CreatedBy,CreatedDate,UpdatedBy,UpdatedDate这样的审计列。但我不想将这些属性添加到域类。我想尽可能地保持域模式的Percistence Ignorance因子。
如何通过NHibernate更新/插入实体时设置一些特殊的列值,而无需扩展具有特殊属性的域类?NHibernate,审计和计算列值
E.g.每个表都包含像CreatedBy,CreatedDate,UpdatedBy,UpdatedDate这样的审计列。但我不想将这些属性添加到域类。我想尽可能地保持域模式的Percistence Ignorance因子。
它与“不添加这些属性”不一样,但最后一次看到这个,工程师通过实现具体的NHibernate类并从通用抽象基类(例如MyAuditable)派生它们来解决它,该类实现了属性你不喜欢。这样你只需要解决一次这个问题。
你可能想试试看NHibernate的IUserType。
在下面的页面底部是一个例子,其中ayende从实体中删除了一些加密逻辑,并允许NHibernate来处理它。
http://ayende.com/Blog/archive/2008/07/31/Entities-dependencies-best-practices.aspx
黑客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)可选。此外,我们可以通过配置每个类在应用程序中扮演的角色的角色来配置种类设置,然后在Interceptor中使用特定于角色的属性。例如。这个配置可能会声明产品是TenantScopeObject,并且拦截器会将当前租户身份值中名为TenantID的属性设置为记录在系统中。
Mapping Timestamp Data Using NHibernate's ICompositeUserType和 Creating a Timestamp Interceptor in NHibernate
我发现这些文章很有用。显然它不是PI,因为你被绑定到NH/SQL。
大多数IoC容器现在都带有拦截器,因此您可以拦截您的更改并将它们排队。如果UoW刷新您的更改,那么您也可以坚持您的审计线索。
注意搜索引擎wayfarers,与NH v2。0和更大的,这是现在很优雅,事件侦听器来做到这一点:
例子:
手册:
http://knol.google.com/k/fabio-maulo/nhibernate-chapter-11-interceptors-and/1nr4enxv3dpeq/14
你能指出我你的方法的完整样本? – 2009-03-23 09:23:46