2009-04-23 55 views
1

我正在维护一个ASP.NET网站,我注意到业务层和其他支持库大量使用HttpContext.Current.Session。这使得很难跟踪会话变量,确定它们用于什么以及它们甚至存在的原因。网站的业务层应该访问会话状态吗?

在业务层中使用会话被认为是不好的做法吗?开始将所有使用会话的代码移动到代码隐藏中是否明智?

回答

5

这几乎从来都不是一个好主意。有很多原因,但这里的一对夫妇:

  • 你永远不可能比ASP.NET
  • 其他任何使用业务层代码
  • 单元测试变得更加痛苦的,甚至是不可能的。

当我们开始构建利用公共业务层代码的服务时,我们遇到了与此完全相同的情况,令人头痛的问题。

1

是的 - BL不应该有关于会话的任何知识。它是您不需要的依赖项。

1

创建一个间接的类,在这种情况下,它可以在Web上返回HttpContext.Current.Session的值,并在其他地方从其他地方解析该类。 IE有一个接口ISessionStore,并具有具体的类WebSessionStore和WindowsFormsSessionStore等

这将使你的代码更容易测试,并且当你说,你现在想要x业务逻辑运行在一个Windows服务可以每y分钟运行一段代码。

3

我遵循这个规则 - System.Web名称空间(Java中的javax.servlet包)中的任何类都不应出现在您的业务层中。

1

在我看来这是不好的做法。

这使得将业务层从环境中分离出来非常困难。例如,如果你期望单元测试这件事,那么你的运气不好。为了照顾这

一种方式简单地将这个隔离成一个抽象现在,这样就可以通过一个“状态缓存”围而不参考HttpContext的。这至少会在某种程度上抽象。 另一个更有趣的问题是,为什么业务层需要引用?

+0

这是关于单元测试的一个好处。至于为何业务层需要的HttpContext:关于登录用户的信息,如他们的角色和权限,保存在会话,这可能会影响业务逻辑做什么。我会试着将状态抽象出来并传递出去 - 这听起来像是一个很好的解决方案。 – tspauld 2009-04-23 20:27:59

1

它总是最好有一个集中的缓存/会话管理器,它封装了与会话/缓存或您使用的任何持久方法的完整交互。让你的BL与会话进行交互肯定是一种非常糟糕的做法,并以某种方式完全破坏了分层架构的目的。