繁体   English   中英

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

[英]How do I make a class library that works in ASP.NET and non-ASP.NET applications?

我想编写一个在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中的内容,例如session,则应将这些变量作为参数传递给您的方法,以便库不依赖于HttpContext。

您可以采取的一种方法是将Web和非Web应用程序之间的行为分解为具有公共接口(即IPlatform )的类,然后使用IOC容器或依赖注入来配置应用程序以使用正确的IPlatform实现。 但是,根据您的需要,这可能会过度工程化。 您可能希望在平台之间添加您想要改变的特定行为。

相反,为什么没有一个公共属性, 调用代码可以设置为告诉你的类的实例是否应该使用他们想要用于ASP.NET的逻辑?

当你不真正需要它时访问HttpContext,以及在所有情况下都没有正常工作(正如你所发现的那样),正在让这个类太多地回到它的环境中。 让它简单地执行它的工作,让调用代码告诉它使用哪组逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM