2009-02-07 96 views
0

當用戶ID不是被傳遞對象中的字段時,將數據提交給數據層,但在提交數據時仍然需要用userID交叉引用表,我應該調用成員資格類來獲取數據層的用戶ID,或者我應該從級別傳遞UserID作爲參數嗎? (即從業務層到數據層?) (或者它不重要無論哪種方式?)我應該在應用程序級別之間傳遞用戶ID嗎?

控制器或業務層:

MembershipUser user = Membership.GetUser(); 
Guid userID = (Guid)user.ProviderUserKey; 
DL.SaveObject (Object, userID); 

OR

做到在數據層:

SaveObject(Object) 
{ 

MembershipUser user = Membership.GetUser(); 
       Guid userID = (Guid)user.ProviderUserKey; 
... 
... 

} 

回答

1

一般來說,我更喜歡在SaveObject()中看到GetUser(),因爲這樣可以將業務層從它抽象出來,並且應該減少數量調用GetUser()的代碼。但這取決於要求。如果您需要根據用戶的用戶來應用業務規則,那麼(也)將其放入業務層可能更有意義。

授權/認證是AOP(面向方面​​編程)最適合處理的一個交叉問題。

更新: CraigTP使得數據層不知道數據來自何處。總的來說,我會同意。在這種情況下,數據持久性機制需要用戶身份,這可能出於安全性和/或審計目的。所以在這種情況下,我寧願將用戶身份訪問呼叫置於需要它的圖層的控制下。我會在另一個調用之後抽象出GetUser()實現的細節,因此數據層沒有對System.Web.Security的依賴。

2

雖然這確實是一個橫切關注點,我個人的偏好是這樣的代碼:

MembershipUser user = Membership.GetUser(); 
Guid userID = (Guid)user.ProviderUserKey; 

不應該在數據層。

我喜歡在高於數據層(通常是業務層)的層中看到這類代碼,因爲我希望我的數據層完全不可知,因爲它將讀取/寫入/處理的數據來自何處從。我希望我的數據收集主要在UI層(用戶提供的數據/輸入的情況下)以及可能在業務層內收集更多的數據(例如收集UserID或檢索用戶角色/授權)。

將諸如此類的代碼放在業務層中可能會導致跨許多不同的域對象重複此代碼,但是,可以通過將此代碼抽象到它自己的對象中並使用對象組合來允許其他域對象來訪問它。

2

傳遞給DataAccessLayer的輸入應該由控制器或BL完成。我不想在DAL中包含除數據讀/寫以外的任何其他內容。 (在這種情況下,DAL被賦予確定當前登錄用戶的任務)

相關問題