【问题标题】:Any issues using HTTPContext outside of web project在 Web 项目之外使用 HTTPContext 的任何问题
【发布时间】: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 应用于此。为了澄清我之前的评论,clsUserProfileHttpContext.Current 以及调用它的任何代码紧密耦合。如果在一行代码中调用AgencyCode,则您没有封装 UserProfile,其他一些代码修改了会话,并且在几行之后再次调用AgencyCode 会产生不同的结果。当然,这个会话的用户必须在你的情况下做一些更新这个值的事情,但这并不是适合所有情况的好设计。

标签: asp.net vb.net


【解决方案1】:

多用户登录时数据是否会被覆盖

没有

很多人说不推荐,但找不到任何可证明的理由不推荐?

在这种情况下,添加第三种运行模式会很痛苦。

实际上,您的类 clsUserProfile 不应该知道您的应用程序运行模式(webapp 或桌面)。它甚至不应该知道 HttpContext 和 Session 或者在两种运行模式之间进行选择,只是为了得到一个 AgencyCode。

clsUserProfile 应该是一个普通的 C# 对象。运行模式应在您的应用中的更高级别处理。

【讨论】:

  • 谢谢。什么可以是第三运行模式。说网络服务,如果我启用会话模式它工作正常。我被赋予了在上述方法中找出漏洞(如果有的话)的任务。除了像你说的那样,外部类不应该控制httpContext,这是一个糟糕的设计,我被要求证明这是一个糟糕的设计。非常感谢您的帮助。
  • 单元测试应该被证明是一种棘手的运行模式。我想对 web 和 windows 运行模式进行单元测试会很痛苦。设计还不错,因为它不起作用(似乎),但是因为它很难理解和修改(仅针对一个 int 属性,我假设我们在连接过程中一劳永逸地设置)
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多