Asp.net 应该是一个网站';谁的业务层访问会话状态?

Asp.net 应该是一个网站';谁的业务层访问会话状态?,asp.net,session,Asp.net,Session,我正在维护一个ASP.NET网站,我注意到业务层和其他支持库大量使用了HttpContext.Current.Session。这使得跟踪会话变量、确定它们的用途以及它们存在的原因变得非常困难 在业务层中使用会话是否被认为是不好的做法?开始将使用该会话的所有代码移到代码隐藏中是否明智?是-BL不应该了解该会话。这是一个您不需要的依赖项。是-BL不应该对会话有任何了解。这是一个您不需要的依赖项。创建一个作为间接寻址的类,在这种情况下,它可能会在web上从HttpContext.Current.Ses

我正在维护一个ASP.NET网站,我注意到业务层和其他支持库大量使用了HttpContext.Current.Session。这使得跟踪会话变量、确定它们的用途以及它们存在的原因变得非常困难


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

是-BL不应该了解该会话。这是一个您不需要的依赖项。

是-BL不应该对会话有任何了解。这是一个您不需要的依赖项。

创建一个作为间接寻址的类,在这种情况下,它可能会在web上从HttpContext.Current.Session返回值,并在其他区域从其他地方解决该问题。IE有一个接口ISessionStore,有具体的类WebSessionStore和WindowsFormsSessionStore等


这将使您的代码更易于测试,并为您提供扩展路径,例如,您现在希望x business logic在windows服务中运行,它可以每y分钟运行x段代码。

创建一个间接类,在这种情况下,它可以在web上从HttpContext.Current.Session返回值,在其他领域,我们可以从其他地方解决这个问题。IE有一个接口ISessionStore,有具体的类WebSessionStore和WindowsFormsSessionStore等


这将使您的代码更易于测试,并为您提供扩展路径,例如,您现在希望x business logic在windows服务中运行,它可以每y分钟运行x段代码。

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

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

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

  • 除了ASP.NET之外,您永远无法在任何其他应用程序中使用业务层代码
  • 单元测试变得更加痛苦甚至不可能

当我们开始构建使用通用业务层代码的服务时,同样的情况也让我们感到非常头疼。

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

  • 除了ASP.NET之外,您永远无法在任何其他应用程序中使用业务层代码
  • 单元测试变得更加痛苦甚至不可能

当我们开始构建使用通用业务层代码的服务时,同样的情况也让我们感到非常头疼。

在我看来,这是一种糟糕的做法

这使得将业务层与环境分离变得非常困难。例如,如果您希望对事物进行单元测试,那么您就不走运了

解决这个问题的一种方法就是暂时将其隔离到一个抽象中,这样您就可以传递一个“状态缓存”,而不必引用HttpContext。这至少会让你达到某种程度的抽象。
另一个更有趣的问题是,为什么业务层需要引用它?

在我看来,这是一种不好的做法

这使得将业务层与环境分离变得非常困难。例如,如果您希望对事物进行单元测试,那么您就不走运了

解决这个问题的一种方法就是暂时将其隔离到一个抽象中,这样您就可以传递一个“状态缓存”,而不必引用HttpContext。这至少会让你达到某种程度的抽象。
另一个更有趣的问题是,为什么业务层需要引用它?

最好有一个集中化的缓存/会话管理器,它封装了与会话/缓存或您使用的任何持久化方法的完整交互。让BL与会话交互肯定是一种非常糟糕的做法,在某种程度上完全违背了分层体系结构的目的

最好有一个集中化的缓存/会话管理器,它封装了与会话/缓存或您使用的任何持久化方法的完整交互。让BL与会话交互肯定是一种非常糟糕的做法,在某种程度上完全违背了分层体系结构的目的

这是关于单元测试的一个好观点。至于为什么业务层需要HttpContext:关于登录用户的信息,比如他们的角色和权限,都保存在会话中,这会影响业务逻辑的功能。我会尝试将状态抽象出来并传递出去——这听起来是一个很好的解决方案。问题是“当前用户”是一个普遍存在的概念,您将通过不需要它的对象层来传递它。听起来使用IOC是一个很好的理由,但这是一个完全不同的游戏,不是一个简单的修改…这是单元测试的一个好观点。至于为什么业务层需要HttpContext:关于登录用户的信息,比如他们的角色和权限,都保存在会话中,这会影响业务逻辑的功能。我会尝试将状态抽象出来并传递出去——这听起来是一个很好的解决方案。问题是“当前用户”是一个普遍存在的概念,您将通过不需要它的对象层来传递它。听起来这是使用国际奥委会的一个很好的理由,但这是一个完全不同的球类比赛,不是一个简单的修改。。。