C# 如何创建在ASP.NET和非ASP.NET应用程序中工作的类库?

C# 如何创建在ASP.NET和非ASP.NET应用程序中工作的类库?,c#,asp.net,C#,Asp.net,我想编写一个在ASP.NET和独立应用程序中工作的类库。在ASP.NET下运行时,需要在行为上有所不同。检查库是否在ASP.NET应用程序中运行的建议方法是什么 我可以检查HttpContext.Current,因为它在不在ASP.NET下运行时似乎可靠地返回null。但是,在ASP.NET的后台线程上运行时,它也会返回null 对HttpContext.Current或其他解决方案有何意见 补充:感谢所有关于如何实现关注点分离的建议。然而,我想补充一点,这个库不会用于一般用途,因此对于我的特殊

我想编写一个在ASP.NET和独立应用程序中工作的类库。在ASP.NET下运行时,需要在行为上有所不同。检查库是否在ASP.NET应用程序中运行的建议方法是什么

我可以检查
HttpContext.Current
,因为它在不在ASP.NET下运行时似乎可靠地返回null。但是,在ASP.NET的后台线程上运行时,它也会返回null

对HttpContext.Current或其他解决方案有何意见


补充:感谢所有关于如何实现关注点分离的建议。然而,我想补充一点,这个库不会用于一般用途,因此对于我的特殊情况,我不需要太多的灵活性。在我看来,到目前为止最好的方法(本线程中未提及)是检查
HttpRuntime.AppDomainAppId
静态是否为null,因为即使对于ASP.NET后台线程,它似乎也可以正常工作。但是,这里提供的各种解决方案肯定会对其他具有更一般需求的解决方案有所帮助。

我会将ASP.NET和桌面应用程序的所有通用代码推送到一个核心库中,并对此进行测试,然后创建位于核心应用程序之上的库,以提供部署细节,例如您的HttpContext调用。然后,您可以在这两种场景中进行可靠的测试,因为您知道只需测试核心应用程序块一次

关于从后台线程检查HttpContext,这没有意义,并且总是返回null,因为HttpContext是由asp.net请求处理器定义的。如果代码启动后台线程,则新线程中的HttpContext将为null。很抱歉:)

作为解决方法,您可以尝试将每个新会话添加到全局集合中
然后从后台线程调用集合。但是,在同步对会话集合的访问时,您需要小心。

我认为将UI代码与应用程序逻辑分离是很常见的

我会将所有应用程序逻辑放入共享库中。根据需要从库中引发事件。然后,您可以在任何希望使用Asp.Net、WPF等的应用程序中处理这些事件


如果应用程序需要HttpContext中可能存在的内容,如会话,则应将这些变量作为参数传递给方法,以便库不依赖HttpContext。

为什么不呢,是否有一个公共属性,调用代码可以设置该属性来告诉类的实例它们是否应该使用用于ASP.NET的逻辑


在您并不真正需要HttpContext时访问它,以及在所有情况下都不能正常工作(正如您所发现的),会使该类太多地返回到其环境中。让它简单地执行它的工作,让调用代码告诉它要使用哪一组逻辑。

您可以采取的一种方法是将Web和非Web应用程序之间不同的行为划分为具有公共接口的类(即
IPplatform
),然后使用IOC容器或依赖项注入来配置应用程序以使用适当的IPPlatform实现。然而,这可能过于工程化,这取决于您的需求。您可能希望在问题中添加您希望在不同平台之间变化的特定行为。

为了澄清,问题涉及如何在运行时实际执行检查,而不是如何进行软件测试。为了避免进一步的混淆,我将原帖子中的“test”改为“check”。所有客户端都是托管代码吗?是的,我希望这是静态确定的。在我的帖子中,我讨论了一个正确的解决方案,就是在app.config/web.config中添加一个设置。但是谢谢你的想法!每次创建实例时都设置它,这超出了我的想象。我考虑过使用静态属性,但与我的其他选项相比,这并不是“获胜”。如果使用静态属性,可以在global.asax文件中进行设置,这将为同一AppDomain中所有线程中创建的所有实例提供一个良好的标志值。