2010-03-05 24 views
5

在我的應用程序中,我有一種情況,我們需要捕獲創建和修改記錄的時間以及用戶執行這些操作的情況。所以我可能有類似的東西:設置上次修改和使用NHibernate進行修改的最佳做法是什麼?

public class Product 
{ 
    int Id; 
    int Name; 
    DateTime CreatedOn; 
    int CreatedByUserId; 
    DateTime LastModifiedOn; 
    int LastModifiedByUserId; 
} 

在NHibernate中處理這些問題的最佳做法是什麼?通過使用攔截器的東西,如描述here

回答

1

我不認爲有一個「最佳」的做法,但使用事件偵聽器更常見。有一個很好的例子:http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx

你需要考慮的一件事是你需要在某處存儲userId。我目前正在通過在啓動時在偵聽器上分配一個靜態屬性來實現這一點。這不太好,但它完成了工作。

+0

不知何故,我認爲這將是答案:)我想我並不是真的在尋找「最好」,而是「推薦」 – 2010-03-08 13:51:11

+0

我們做了類似的事情,但是通過了'Func '我們的「審覈員」。爲了測試,我們只需要返回一個固定值,並且在生產中我們傳遞一個調用'HttpContext.Current.User'的函數。 – 2013-07-04 11:38:09

+0

@Diego Mijelshon Yuck很醜陋...不幸的是我想我也必須這樣做! – richard 2016-12-31 02:55:07

0

我同意Diego的觀點,我認爲這不是最佳做法。這取決於您的應用程序上下文。在迭戈的鏈接中,並且在持久化(nHibernate)級別使用事件監聽器,它需要知道如何查找當前用戶。根據您的應用,這可能沒有意義。例如,如果你正在編寫一個ASP.NET MVC應用程序,你真的希望你的持久層依賴於HttpContext來知道用戶嗎?是的,你可以通過某種策略,但這似乎並不總是正確的做法。

我認爲讓服務層構建對象並添加創建者本身是完全有效的。然後傳遞整個對象,創建者已經水化,直到nHibernate持久化。創建者將以與任何其他屬性相同的方式保存到數據庫。

+0

我的應用程序(ASP.NET MVC)是使用存儲庫等構建的,因此傳遞用戶信息會很有趣。我絕對不希望repos直接引用HttpContext,因此我需要找到一種方法將這些信息優雅地傳遞給存儲庫。 – 2010-03-08 13:53:52

+0

你可以制定策略;創建某種ICurrentUserProvider並從控制器/服務層傳遞下來。 ICurrentUserProvier將有一個委託指向一個使用HttpContext來解析當前用戶的方法。也就是說,這仍然是DIP的違規行爲,應儘可能避免。 – manu08 2010-03-08 14:43:43

+0

我使用IoC在需要的地方注入用戶,像這樣在autofac中:builder.Register(c => HttpContext.Current.User).HttpRequestScoped(); – UpTheCreek 2010-06-14 11:25:32

相關問題