如何通過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