我們有一個Web應用程序,可以訪問單獨項目中的業務邏輯和數據訪問。在web項目之外使用HTTPContext的任何問題
按照它的設計方式,鍵值永遠不會傳遞到數據訪問層或業務邏輯。相反,業務層有一個包含DAL層訪問值的公共只讀屬性的類。
業務邏輯層位於不同的項目中。 Web項目獲得參考。 業務邏輯層有這個類:Public NotInheritable Class clsUserProfile
具有這種性質:
Public ReadOnly Property AgencyCode() As Integer
Get
If clsAppInfo.IsWebApplication Then
If (HttpContext.Current.Session(_AgencyCodeKey) Is Nothing) Then
Return 0
Else
Return HttpContext.Current.Session(_AgencyCodeKey)
End If
Else
Return AgencyCodeWIN
End If
End Get
End Property
/**對於windows機構代碼被聲明爲共享
Public Shared Property AgencyCodeWIN() As Integer
Get
Return _AgencyCodeWIN
End Get
Set(ByVal value As Integer)
_AgencyCodeWIN = value
End Set
End Property
/* ** * 確定它是否是一個網絡應用程序.......
Public Shared ReadOnly Property IsWebApplication() As Boolean
Get
If AppCodeWIN IsNot String.Empty Then
'Desk top App is required to pass AppInfo
Return False
Else
'Web App is default
Return True
End If
End Get
End Property
當多個用戶登錄時,數據是否會被覆蓋。 很多人說這不是可取的,但找不到任何可證明的理由,爲什麼不推薦?
如果有人可以給出明確的理由,那將是非常好的。
謝謝, 沙。
我認爲人們會提出反對的原因是因爲您已將代理商和代理商的職責分割爲AgencyCode。換句話說,'clsUserProfile#AgencyCode'需要'HttpContext.Current'才能存在,但是如果它不存在**,你就會黑掉它以返回一個特殊值**。人們可能會抱怨的另一個原因是Session會爲每個請求獲取一個鎖(參見這裏)(http://msdn.microsoft.com/en-us/library/aa479041.aspx))。 –
謝謝吉姆。我被賦予證明爲什麼在web項目之外使用httpcontext是一個壞主意。使用上述方法,如果我分配會話變量,那麼對於Web項目,我將獲得數據。如果它是一個非web項目,我可以使用AgencycodeWin設置值。當多個用戶登錄時數據不會被覆蓋。那麼爲什麼在這種方式之外採取這種做法並不好?我要求證明這是一個糟糕的設計。非常感謝您的幫助。 – Sandhya
您可以將[SOLID原則](http://en.wikipedia.org/wiki/SOLID_(object-oriented_design))應用於此。爲了澄清我以前的評論,'clsUserProfile'與'HttpContext.Current'緊密耦合,並且與任何代碼調用它。如果您在調用「AgencyCode」的一行代碼中,某些其他代碼修改了會話,並在幾行後再次調用「AgencyCode」會產生不同結果,則不會封裝_UserProfile_。當然,這次會議的用戶將不得不做一些更新你的情況的價值,但對於所有情況來說都不是好的設計。 –