【问题标题】:Accessing HttpContext in a class library - ASP.NET MVC在类库中访问 HttpContext - ASP.NET MVC
【发布时间】:2011-08-23 13:41:45
【问题描述】:

我正在填充一个表示会话变量并存在于类库中的类的实例。我需要填充一个需要我访问Request 对象的属性。我知道我可以使用System.Web.HttpContext.Current.Request 来获取请求对象?

这是一个好习惯吗?有些东西告诉我,我应该在具有 System.Web 命名空间的控制器(或基本控制器)中执行此操作。

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    这不是一个坏习惯——对象是可用的——如果你设计要求在那里访问它——那么一定要这样做。一种选择是将请求的实例传递给类的构造函数,如果它让你感觉更干净:)

    【讨论】:

    • 这不是将类库耦合到System.Web 命名空间。如果将来这个类库被移到 Web 项目之外,那么它不会知道关于 HttpContext 对象的任何事情,这是一个有效的论点吗
    • 我倾向于使用“如果你现在不需要它,就不要现在写它”的原则。您可以随时重构。如果将来需要重构对 HttpContext 的引用,则必须以不同的方式对 HttpContext 执行任何操作。这将意味着您将需要一个新的接口类来完成您想要做的任何事情,包括 Web 接口的实现和 Windows 窗体或其他接口的实现。但我的意见是,当你知道你需要它时就去做。不要试图猜测有一天你可能需要什么。
    • 如果你想解耦,然后写入一个接口或另一个充当代理的类(适配器模式),但它是你的调用。在所有“理论”中,我将不得不换掉一个完整的实现非常非常罕见,所以如果你真的觉得它可以将来改变..然后只写一个中间对象,否则,使用上下文。
    【解决方案2】:

    根据 ASP.NET 论坛上的Teemu Keiski

    您可以使用System.Web.HttpContext.Current,但这是不好的做法 因为它使您的类库在网络之外完全无法使用 应用程序(如果你通过它访问 Sessions,它也会得到 在大多数情况下无法用于 Web 服务)。

    通过直接获取 HttpContext 传递的任何内容都可以传递为 参数到需要它的类中。如果您需要访问 直接响应对象,你可以将Response.OutputStream 传入 类(将其作为一般 Stream 对象)

    来源:http://forums.asp.net/post/1311405.aspx

    【讨论】:

    【解决方案3】:

    只要你依赖System.Web.Abstractions 并将HttpRequestBase 的引用传递给你的类,这基本上没有任何问题。此程序集中的类不是密封的,所有成员都是虚拟的,这意味着您的类仍然是可测试的。

    以下SO question的答案中的更多信息

    【讨论】:

      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      相关资源
      最近更新 更多