创建一个用于IHttpModules的HttpContextProvider是错误的吗?

时间:2016-03-09 13:59:56

标签: asp.net-mvc httpmodule solid-principles

我有这个遗留的ASP.NET webapp,它主要是转换为MVC。代码可测试性通常很糟糕,因为它对遗留应用程序来说发生了很多事情:责任是混乱的,紧密耦合占优势,等等。

我一直在重构应用程序几周以提高可测试性,尽我所能遵守SOLID,而且我已经到了这一点,我需要通过HttpContextHttpResponse等等HttpModule中的方法。现在,显然HttpModules可以获取HttpApplication的副本并且只是传递它到处 - 这就是它的atm - 但我宁愿不授予对依赖项这么大的根对象的访问权限。

因为我们的一些IHttpModules在MVC发挥作用之前被初始化了,所以我在使用IoC容器将HttpContextBaseHttpResponseBase注入各种帮助的构造函数时遇到了问题模块使用。因此,我必须将HttpContextBase传递给所述助手的方法 - 使用起来很费力并且感觉有点不对 - 或者创建这样的东西:

public class HttpContextProvider : IHttpContextProvider {
    // ... ctor
    public HttpContextBase GetContext() { return HttpContext.Current; }
}

然后,我会将实现IHttpContextProvider的实例注入帮助程序,并在以后根据需要调用.GetContext()

直观地说,我觉得我可能做错了什么,但却无法真正理解它可能是什么。整个重构过程非常复杂 - 团队中的总线因素足够低 - 我对于这个问题请求过多的领导开发时间犹豫不决,从实际角度来看几乎可以看作是学术性的。

1 个答案:

答案 0 :(得分:1)

我可以提出不同的选择

  1. 尝试在IoC中注册这些对象,但为了解决问题(该类在其依赖性可以解决之前被初始化)只需使用 Lazy< T> ,大​​多数IoC支持它们,检查你的是否
  2. 在您的示例中引入提供程序,但我建议它不返回 HttpContext (或 HttpResponse ),但是这些类正是您需要的,它会在测试中更容易模拟这种行为(你甚至可能根本不需要在那里构建上下文),它也会隐藏所有未使用的 HttpContext 的复杂内容
  3. 第二个选项仅在每次以相似的方式使用此对象时才有效 - 这样您就可以用2-3种ISmthProvider方法替换它。如果您总是以不同的方式使用对象,那么将两种方法结合起来并将最常用的用法提取到某些服务中以及在其他地方路径 Lazy< HttpContextBase> 到构造函数

    在我看来,最好不要直接传递 HttpContext / HttpResponse ,因为它提供了太多东西的访问权限,后来人们可以把它弄得乱七八糟(使用它而不用考虑因为它已经存在)结果很难测试并在以后进行重构。