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

11

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

这是一个好的做法吗?有些东西告诉我应该在具有System.Web命名空间的控制器(或基础控制器)中完成此操作。

3个回答

12

这不是一种不好的做法 - 对象是可用的 - 如果你的设计决定需要访问它,那么可以毫不犹豫地这样做。如果你感觉更加清晰,一种选择是在类的构造函数中传入请求的实例:


2
这难道不是把类库和 System.Web 命名空间耦合在一起吗?如果将来这个类库移到 Web 项目之外,那么它就不会知道任何关于 HttpContext 对象的东西了,这是一个有效的论点吗? - DotnetDude
4
我倾向于使用“不需要现在写的内容,就不要现在写”的原则。您可以随时进行重构。如果将来需要重构对HttpContext的引用,您将需要以不同的方式完成HttpContext相关操作。这意味着您需要为您想要执行的任何操作编写一个新的接口类,并为Web应用程序实现该接口,为Windows窗体或其他应用程序实现该接口。但我的建议是,在您确实需要它时再去做。不要试图猜测未来可能需要什么。 - Katie Kilian
1
如果你想解耦,那么编写一个充当代理的接口或另一个类(适配器模式)即可,但这取决于你。在所有的“理论”中,我很少需要交换完整的实现,所以保护代码的“如果发生了什么”的情况有时永远不会出现:) 如果你真的觉得它将来可能会改变...那么就编写一个中间对象,否则使用上下文。 - Adam Tuliper

7
根据ASP.NET论坛上的Teemu Keiski所说:
你可以使用System.Web.HttpContext.Current,但这是不好的实践,因为它使你的类库在web应用程序之外完全无法使用(如果通过它访问Sessions,则在大多数情况下也无法用于Web服务)。
通过直接获取HttpContext传递的任何内容都可以作为参数传递给需要它的类。如果需要直接访问Response对象,则可以将Response.OutputStream传递给该类(该类将其视为通用Stream对象)。 来源:http://forums.asp.net/post/1311405.aspx

12
最好引用一下你从这里复制粘贴的内容的来源:http://forums.asp.net/t/998446.aspx/1 - AndyMcKenna

6

从根本上说,只要您对 System.Web.Abstractions 进行依赖,并将引用传递到您的类中的 HttpRequestBase,这样做就没有什么问题。 此程序集中的类未封装,所有成员均为虚拟成员,这意味着您的类仍然可以进行测试。

有关更多信息,请参见以下SO问题的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接