【发布时间】:2012-11-08 13:58:05
【问题描述】:
我们有一个 Web 应用程序,可以访问不同项目中的业务逻辑和数据。
按照它的设计方式,键值永远不会传递给数据访问层或业务逻辑。相反,业务层有一个包含公共只读属性的类,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 的 getter 和 setter 的责任分开。换句话说,
clsUserProfile#AgencyCode要求HttpContext.Current存在,但是您已经破解了它以返回一个特殊值如果它不存在。人们可能抱怨的另一个原因是 Session 每个请求都会获取一个锁 (see here)。 -
谢谢吉姆。我的任务是证明为什么在 Web 项目之外使用 httpcontext 是一个坏主意。使用上述方法,对于 Web 项目,如果我分配会话变量,我会得到数据。如果它是一个非 Web 项目,我可以使用 AgencycodeWin 设置值。多个用户登录时数据不会被覆盖。那么为什么这样带出去不好呢?我要求证明这是一个糟糕的设计。非常感谢您的帮助。
-
您可以将SOLID principles 应用于此。为了澄清我之前的评论,
clsUserProfile与HttpContext.Current以及调用它的任何代码紧密耦合。如果在一行代码中调用AgencyCode,则您没有封装 UserProfile,其他一些代码修改了会话,并且在几行之后再次调用AgencyCode会产生不同的结果。当然,这个会话的用户必须在你的情况下做一些更新这个值的事情,但这并不是适合所有情况的好设计。