在类库中访问HttpContext - ASP.NET MVC

Dot*_*ude 10 asp.net asp.net-mvc

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

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

Ada*_*SFT 12

这不是一个糟糕的做法 - 对象是可用的 - 如果你设计指令来访问它 - 那么一定要做.一种选择是将请求的实例传递给类的构造函数,如果它让你感觉更清洁:)

  • 我倾向于使用如果你现在不需要的原则,不要立刻写下来.你以后总是可以重构.如果您将来需要重构对HttpContext的引用,那么您将不得不以不同的方式对HttpContext进行任何操作.这意味着您将需要一个新的接口类,无论您正在尝试做什么,都需要实现Web接口的实现,以及Windows窗体或其他任何接口的实现.但我的意见是,当你知道自己需要它的时候去做.不要试图猜测有朝一日你可能需要什么. (4认同)
  • 这不是将类库耦合到`System.Web`命名空间.将来,如果将这个类库移到Web项目之外,那么它对于`HttpContext`对象一无所知是一个有效的论据吗? (2认同)

Pri*_*ank 6

根据Teemu Keiski在ASP.NET论坛上的说法:

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

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

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

  • 将你复制和粘贴的地方引用可能不会有什么坏处:http://forums.asp.net/t/998446.aspx/1 (12认同)

Dar*_*wis 6

从根本上说,只要你依赖System.Web.Abstractions并传入你的类引用就没有错HttpRequestBase.此程序集中的类未密封,所有成员都是虚拟的,这意味着您的类仍然可以测试.

以下SO问题的答案中的更多信息