我有两个项目,一个包含我所有的逻辑和数据访问内容的 DLL 项目,以及一个完成我的表单等的 ASP.NET 项目。
我有点困惑。我想如果我将 System.Web 命名空间引用添加到 DLL 项目中,我将能够引用 ASP.NET 页面的会话状态信息。
我可以使用每个页面来获取会话信息并将其传递给 DLL 进行处理,但我希望能够直接从 DLL 类处理事物。
这可能吗?
我已经摆弄了 System.Web 命名空间,并且似乎能够获得对 Session 变量的引用。
谢谢大家。
乔恩
我有两个项目,一个包含我所有的逻辑和数据访问内容的 DLL 项目,以及一个完成我的表单等的 ASP.NET 项目。
我有点困惑。我想如果我将 System.Web 命名空间引用添加到 DLL 项目中,我将能够引用 ASP.NET 页面的会话状态信息。
我可以使用每个页面来获取会话信息并将其传递给 DLL 进行处理,但我希望能够直接从 DLL 类处理事物。
这可能吗?
我已经摆弄了 System.Web 命名空间,并且似乎能够获得对 Session 变量的引用。
谢谢大家。
乔恩
只要将Assembly 加载到Session 的范围内,它就可以访问。
虽然这种类型的紧密耦合并不真正推荐。
您应该能够使用 HttpContext.Current.Session
虽然是的,但我同意您不应该将您的业务逻辑 DAL 或其他程序集紧密耦合到 ASP.Net 会话。在 Web 项目之外访问 HTTP 上下文有很多有效的案例。
Web Controls 可能是最好的例子之一,可重用的 HTTP 模块等。
现在一个选项,如果你想让你的 DLL 从 Session 中提取东西,就是抽象出会话。所以你可以定义一个像 IStorage 这样的接口,你的库会知道如何使用它。然后,您可以拥有一个 SessionStorage 或 MemoryStorage 类,并使用 IoC 将适当的类注入到您的库类中。这使您可以自由地对其进行编码,而无需将代码绑定到 Session。哦,如果做得好,另一个好处可以用来不将您的代码绑定到网络上的会话。
您始终可以在 DLL 中使用 HttpContext.Current.Session ,但这被认为是不好的做法。更好的方法是将存储在会话字典中的值传递给您的 DLL,而不是引用会话。您将获得的另一个好处是您的 DLL 中的代码不会与 ASP.NET 运行时耦合,这意味着它将更容易测试。
正如其他人所说,您始终可以在您的 DLL 中使用 HttpContext.Current.Session,我假设它是您的 BAL,但您需要非常小心。如果您的 DLL 稍后被 Windows 服务或其他没有 HTTPContext 的应用程序使用怎么办?每当我这样做时,它总是在一个属性获取方法中,我将访问 HttpContext.Current.Session 的尝试包装在一个 try catch 块中,如果出现任何问题,我会从数据库中取出所需的数据。
不要使用 HttpContext.Current.Session,因为您的 dll 不会始终与 Web 应用程序一起运行。它可以与 Windows、Console itc 等任何其他应用程序一起运行。
如果您使用的是 ASP.Net 应用程序,最好使用实际接受参数的方法,该参数将来自会话值,否则将不会有任何应用程序的依赖关系。如果您的 dll 项目已经开发并且您正在尝试修改现有的业务逻辑,那么不,不要修改您的现有方法,使用重载方法。