2009-06-24 59 views
3

我目前正在開發一個ASP.NET人力資源系統。我正在使用基於MVP模式的Web客戶端軟件工廠的分層架構。 ORM是NHibernate。我需要實施審計日誌模塊。我讀了很多關於不同的方法。他們中的大多數描述瞭如何跟蹤日期,時間戳和做出該更改的人員的身份,但沒有人能告訴我有關此問題的一個方法:如何跟蹤我的域圖層中任何屬性的更改?我不需要任何回滾功能,我只需要登錄:什麼對象的誰,何時和什麼屬性被更改,該屬性的舊值和新值。提示審覈日誌方法

我不能決定把這個改變的處理程序放在哪裏。福勒指出審計日誌屬性的setter方法,但我仍然想讓我的域類簡單POCO的。也許還有其他方法?

+0

你認爲AOP已經? – Paco 2009-06-24 21:19:09

回答

2

我不得不在幾年前爲HR系統做這個。我完成有我所有的「域」實現的模板(通用)是:

這裏是我做了下調模板的一個例子:

class DataField<T> 
{ 
    public T Current { get; set; } 
    public T Original { get; set; } 
    // stores the field name as a nice textual readable representation. 
    // would default to property name if not defined. 
    public string FieldName { get; set; } 
    public bool Modified 
    { 
     get { return !(Current.Equals(Original)); 
    } 

    public DataField(T value) 
    { 
     Original = Current = value; 
    } 

    public DataField(T value, T fieldName) 
    { 
     Original = Current = value; 
     FieldName = fieldName; 
    } 
} 

關於它的有趣的部分是由auditting方便的是,每個對象都可以生成它自己的審計日誌。我可以接受任何可能包含x個這些'字段'的對象,然後調用GetAudit,它將返回一個審計對象,其中包含顯示字段名稱,舊val,新val等的所有更改。每個'DataField'將實現一個返回審計對象的方法。對於字符串,雙精度,整數等,它幾乎已經被烘焙了,但是如果你使用了自定義對象,你可以爲它們編寫審計實現,只需要返回一個審計對象。

因此,在最後的典型形式中,我將所有數據存儲在一個具有所有這些類型字段的對象中。然後我會進行更新並調用GetAudit方法,該方法也將寫入審計表。

我可以很容易地分辨什麼形式發生了變化,即使他們不得不通過多個頁面等

撤消的是在逐個字段,逐節或整個對象級別真的很容易,以及。

對於確切的細節我幾乎沒有觸及代碼,但這是它的要點。希望有所幫助。

0

也許你可以實現觀察者模式,但是,因爲.net隱式實現這個模式(有事件),我認爲不會有太多的附加價值。

也許你可以保存「原始」objetcs,並在時間正確的時候(可能使用反射)將它們與修改後的對象進行比較,找出哪些屬性發生了變化,以及它們的新值是什麼。 但是,請注意,您無法在.net中製作對象的深度複製(除非您可以序列化對象),請記住該解決方案

0

您需要將原始數據保留在對象中,或者將其從數據庫中提取以便在更新之前進行日誌記錄。

我已經看到這在數據層實現,無論是在存儲過程或觸發器,但從來沒有在域層。

編輯:使用數據庫觸發器記錄歷史記錄的2部分示例在這裏找到:http://www.4guysfromrolla.com/webtech/041807-1.shtml似乎有很多關於這種技術的優點/缺點的良好討論。我希望有所幫助。

+0

好的,也許我想要的太多了,但是你能分享一些代碼或者diagramm,它們可以在數據層或者服務層上說明這種方法......我只是無法想象這樣的審計系統...... – Alkersan 2009-06-25 11:59:08