5

我有两个项目,一个包含我所有的逻辑和数据访问内容的 DLL 项目,以及一个完成我的表单等的 ASP.NET 项目。

我有点困惑。我想如果我将 System.Web 命名空间引用添加到 DLL 项目中,我将能够引用 ASP.NET 页面的会话状态信息。

我可以使用每个页面来获取会话信息并将其传递给 DLL 进行处理,但我希望能够直接从 DLL 类处理事物。

这可能吗?

我已经摆弄了 System.Web 命名空间,并且似乎能够获得对 Session 变量的引用。

谢谢大家。

乔恩

4

5 回答 5

11

只要将Assembly 加载到Session 的范围内,它就可以访问。

虽然这种类型的紧密耦合并不真正推荐。

于 2009-01-17T22:27:09.720 回答
10

您应该能够使用 HttpContext.Current.Session

编辑

虽然是的,但我同意您不应该将您的业务逻辑 DAL 或其他程序集紧密耦合到 ASP.Net 会话。在 Web 项目之外访问 HTTP 上下文有很多有效的案例。

Web Controls 可能是最好的例子之一,可重用的 HTTP 模块等。

现在一个选项,如果你想让你的 DLL 从 Session 中提取东西,就是抽象出会话。所以你可以定义一个像 IStorage 这样的接口,你的库会知道如何使用它。然后,您可以拥有一个 SessionStorage 或 MemoryStorage 类,并使用 IoC 将适当的类注入到您的库类中。这使您可以自由地对其进行编码,而无需将代码绑定到 Session。哦,如果做得好,另一个好处可以用来不将您的代码绑定到网络上的会话。

于 2009-01-17T22:28:34.227 回答
2

您始终可以在 DLL 中使用 HttpContext.Current.Session ,但这被认为是不好的做法。更好的方法是将存储在会话字典中的值传递给您的 DLL,而不是引用会话。您将获得的另一个好处是您的 DLL 中的代码不会与 ASP.NET 运行时耦合,这意味着它将更容易测试。

于 2009-01-17T22:34:34.620 回答
2

正如其他人所说,您始终可以在您的 DLL 中使用 HttpContext.Current.Session,我假设它是您的 BAL,但您需要非常小心。如果您的 DLL 稍后被 Windows 服务或其他没有 HTTPContext 的应用程序使用怎么办?每当我这样做时,它总是在一个属性获取方法中,我将访问 HttpContext.Current.Session 的尝试包装在一个 try catch 块中,如果出现任何问题,我会从数据库中取出所需的数据。

于 2009-01-17T22:50:11.920 回答
1

不要使用 HttpContext.Current.Session,因为您的 dll 不会始终与 Web 应用程序一起运行。它可以与 Windows、Console itc 等任何其他应用程序一起运行。

如果您使用的是 ASP.Net 应用程序,最好使用实际接受参数的方法,该参数将来自会话值,否则将不会有任何应用程序的依赖关系。如果您的 dll 项目已经开发并且您正在尝试修改现有的业务逻辑,那么不,不要修改您的现有方法,使用重载方法。

于 2013-04-10T06:43:50.183 回答