代码之家  ›  专栏  ›  技术社区  ›  Jason Kresowaty

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

  •  2
  • Jason Kresowaty  · 技术社区  · 15 年前

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

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

    对任何意见 httpContext.current当前 或者其他解决方案?

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

    4 回复  |  直到 15 年前
        1
  •  7
  •   flesh    15 年前

    我将把ASP.NET和桌面应用程序共同使用的所有代码都推到一个核心库中并进行测试,然后创建位于核心应用程序之上的库,以提供部署细节-例如,您的httpContext调用。然后,您可以在这两种情况下进行可靠的测试,因为您只需要测试一次核心应用程序块。

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

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

        2
  •  3
  •   brendan    15 年前

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

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

    如果您的应用程序需要一些可能在httpcontext中的东西,比如会话,那么您应该将这些变量作为参数传递给您的方法,这样库就不依赖httpcontext。

        3
  •  3
  •   Jacob    15 年前

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

        4
  •  0
  •   richardtallent    15 年前

    为什么不拥有一个公共财产 打电话 代码可以设置为告诉类的实例它们是否应该使用预期用于ASP.NET的逻辑?

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