2012-11-08 28 views
3

我們有一個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 

當多個用戶登錄時,數據是否會被覆蓋。 很多人說這不是可取的,但找不到任何可證明的理由,爲什麼不推薦?

如果有人可以給出明確的理由,那將是非常好的。

謝謝, 沙。

+0

我認爲人們會提出反對的原因是因爲您已將代理商和代理商的職責分割爲AgencyCode。換句話說,'clsUserProfile#AgencyCode'需要'HttpContext.Current'才能存在,但是如果它不存在**,你就會黑掉它以返回一個特殊值**。人們可能會抱怨的另一個原因是Session會爲每個請求獲取一個鎖(參見這裏)(http://msdn.microsoft.com/en-us/library/aa479041.aspx))。 –

+0

謝謝吉姆。我被賦予證明爲什麼在web項目之外使用httpcontext是一個壞主意。使用上述方法,如果我分配會話變量,那麼對於Web項目,我將獲得數據。如果它是一個非web項目,我可以使用AgencycodeWin設置值。當多個用戶登錄時數據不會被覆蓋。那麼爲什麼在這種方式之外採取這種做法並不好?我要求證明這是一個糟糕的設計。非常感謝您的幫助。 – Sandhya

+0

您可以將[SOLID原則](http://en.wikipedia.org/wiki/SOLID_(object-oriented_design))應用於此。爲了澄清我以前的評論,'clsUserProfile'與'HttpContext.Current'緊密耦合,並且與任何代碼調用它。如果您在調用「AgencyCode」的一行代碼中,某些其他代碼修改了會話,並在幾行後再次調用「AgencyCode」會產生不同結果,則不會封裝_UserProfile_。當然,這次會議的用戶將不得不做一些更新你的情況的價值,但對於所有情況來說都不是好的設計。 –

回答

0

將當多個用戶登錄

沒有

很多人說,這是不可取的,但無法找到任何可以證明的理由,爲什麼它不是數據將被覆蓋推薦的?

在這種情況下,添加第三個運行模式將是一個痛苦。

事實上,您的類clsUserProfile不應該知道您的應用程序運行模式(webapp或桌面)。它甚至不應該瞭解HttpContext和Session,或者在兩種運行模式之間選擇,以獲得AgencyCode。

clsUserProfile應該是一個普通的C#對象。運行模式應該在您的應用程序的較高級別處理。

+0

謝謝。什麼可以是第三種運行模式。說網絡服務,如果我啓用sessionmode它可以正常工作。如果有的話,我已經被賦予了上述方法中的漏洞。除了像你說的,外部類不應該控制httpContext,並且這是一個糟糕的設計,我被要求證明這是一個糟糕的設計。非常感謝您的幫助。 – Sandhya

+0

單元測試應該證明是一個棘手的運行模式。我想單元測試web和windows運行模式會很痛苦。 設計並不壞,因爲它不工作(它似乎),但因爲它是很難理解和修改(只是爲了一個int屬性,我假設我們在連接過程中一勞永逸地設置) – jbl