我可以在外部DLL中使用ASP.NET Session []变量

时间:2009-01-17 22:24:57

标签: c# asp.net session-state session-variables

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

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

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

这可能吗?

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

谢谢大家。

乔恩

5 个答案:

答案 0 :(得分:11)

只要在Session的范围内加载程序集,它就可以访问。

虽然不建议采用这种紧耦合方式。

答案 1 :(得分:10)

您应该可以使用HttpContext.Current.Session

修改

虽然是,但我同意您不应将Business Logic DAL或其他程序集紧密地耦合到ASP.Net会话。有很多有效的案例可以在Web项目之外访问HTTP Context。

Web控件实际上是最好的例子之一,可重用的http模块等等......

现在有一个选项,如果你想让你的DLL从Session中提取东西就是抽象出会话。因此,您可以定义一个类似IStorage的界面,您的库将知道如何使用。然后你可以有一个SessionStorage或MemoryStorage类,并使用IoC将适当的类注入你的库类。这使您可以自由地编写代码,无需将代码绑定到Session。哦,如果正确完成另外一项好处,可以用来不将你的代码绑定到网络中的会话。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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