2009-02-26 28 views
1

背景:LINQ審計和當前用戶與Web應用程序

我有我需要爲插入做數據庫審計Web應用程序/刪除/更新(也許讀)。我使用LINQ作爲我的ORM。使用我在網上找到的一些想法,我想出了一種使用屬性來裝飾我的實體的方法,這些實體具有關聯的審計表。除了當前用戶的id和名稱,修改類型,修改時間以及操作是否成功等字段外,審計表本身還需要包含與原始表相同類型的相同列。審計發生在SubmitChanges期間 - 我的數據上下文是抽象的,我在我的具體實現中繼承和重寫SubmitChanges。抽象數據上下文實際上來自AbstractAuditableDataContext,它擴展了DataContext併爲當前用戶標識和名稱添加了CurrentUser屬性和佔位符。默認情況下,對於沒有登錄用戶的實例,這些爲0和「system」 - 例如在註冊或登錄時可以更新用戶表的某些字段。該應用程序使用ASP.NET MVC以C#編寫。

問題:

什麼來填充我的派生數據上下文的當前用戶屬性的最佳方式?我是否應該創建一個實用程序類,該實用程序類在AuditUtility中進行注入,該實用程序檢查是否已設置CurrentUser,如果沒有,則填充它。對於測試,我會嘲笑這一點,但在實際應用程序中它可能會使用懶惰在會話中加載並獲取/設置它。或者我應該修改數據上下文工廠(由所有控制器使用)來執行此功能。我已經在單元測試期間使用模擬工廠,所以這不涉及創建新類。或者,派生應該在工廠之外完成,並且在創建上下文時注入當前用戶。這將允許我「代表」審計。

我意識到這是有點主觀,但我會很感激你可能貢獻的任何想法/經驗。

謝謝。

回答

0

我最終創建了一個CurrentUserUtilityBase類,該類有一個GetAuditUser方法,它接受當前數據上下文並檢索與HttpContext.User.Identity中當前用戶名相對應的用戶對象。它使用此對象來提取當前用戶的ID和顯示名稱,並創建並返回包含這些屬性的AuditUser對象。

我的實現類使用工廠來獲取我的數據上下文的實例,並調用此數據上下文中的基類方法。我的數據上下文的工廠方法使用當前用戶實用程序在創建後將上下文的當前用戶注入到上下文中。

0

DataContext(應用程序,會話,請求,每個BusinessObject ..)的範圍是什麼?如果它有所不同,您可能根本不想將當前用戶緩存在DataContext中(或在創建期間進行設置)。我可能會在DataContext中使用一個Property,它會在需要時從Session中檢索當前用戶(以某種方式)。

+0

數據上下文範圍是每個操作 - 它是非常短暫的。 – tvanfosson 2009-02-26 15:43:21

1

如果您使用Windows或Forms身份驗證,則可以在不傳入任何內容的情況下檢查HttpContext。如果您不在Web上下文中,請從Thread中獲取用戶。也許:

if(HttpContext.Current != null) 
{ 
    //grab the user from the HttpContext 
} 
else 
{ 
    //grab the user from the Thread 
} 
+0

但是你會把這個代碼放在哪裏?在創建數據上下文時還是每次調用該實用程序時? – tvanfosson 2009-02-26 16:54:42

1

System.Threading.Thread.CurrentPrincipal應該給你你正在尋找的答案。

相關問題