我能在外部DLL中使用ASP.NET Session[]变量吗?

5
我有两个项目,一个是DLL项目,包含所有的逻辑和数据访问内容,另一个是ASP.NET项目,用于处理表单等等。
我有点困惑。我原以为如果在DLL项目中添加System.Web命名空间引用,就可以引用ASP.NET页面的Session状态信息。
我可以使用每个页面获取Session信息并将其传递给DLL进行处理,但希望能够直接从DLL类中处理事务。
这可行吗?
我尝试使用System.Web命名空间,似乎只能获得对Session变量的引用。
谢谢大家。
Jon

1
谢谢大家。我已经决定将事情分开处理。我已经为任何要放入会话中的对象创建了一个接口,因此我将在页面中提取会话数据,然后将其传递给我的业务逻辑。我同意这可以在不同的情况下使用。谢谢大家! :) - Jon
5个回答

11
只要程序集在会话的范围内被加载,它就可以被访问。尽管这种紧密耦合的方式并不是非常推荐。

1
谢谢您关于不推荐它的评论。我会选择引用该页面并让DLL执行逻辑。 - Jon

10

你应该能够使用HttpContext.Current.Session。

编辑

虽然我同意你不应该将业务逻辑DAL或其他程序集与ASP.Net session紧密耦合,但访问HTTP上下文的有效情况还是很多的。

Web控件可能是最好的示例之一,可重用的HTTP模块等。

现在,如果您想让您的DLL从Session中提取数据,则可以抽象出session。您可以定义一个像IStorage这样的接口,让您的库知道如何使用它。然后,您可以有一个SessionStorage或MemoryStorage类,并使用IoC将适当的类注入到库类中。这使您可以自由编写代码,而不必将其与Session绑定。如果正确执行,另一个好处是也可以用于不将您的代码与Web会话绑定。


1
谢谢您提供的信息,完美地回答了我的问题...但正如Tom所说,我认为最好不要将它们紧密耦合。但是,就我的问题而言,您说得很到位。 - Jon

2

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


2

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


1
请勿使用HttpContext.Current.Session,因为您的dll不会始终与Web应用程序一起运行。它可能与任何其他应用程序一起运行,如Windows、Console等。
最好使用一个实际接受参数的方法,该参数将来自Session值,如果您正在使用ASP.Net应用程序,否则将没有任何依赖关系。如果您的dll项目已经开发完毕,并且您正在尝试修改现有的业务逻辑,则不要修改现有的方法,而是使用Overload方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接