我有这个遗留的ASP.NET webapp,它主要是转换为MVC。代码可测试性通常很糟糕,因为它对遗留应用程序来说发生了很多事情:责任是混乱的,紧密耦合占优势,等等。
我一直在重构应用程序几周以提高可测试性,尽我所能遵守SOLID,而且我已经到了这一点,我需要通过HttpContext
或HttpResponse
等等HttpModule
中的方法。现在,显然HttpModules
可以获取HttpApplication
的副本并且只是传递它到处 - 这就是它的atm - 但我宁愿不授予对依赖项这么大的根对象的访问权限。
因为我们的一些IHttpModules
在MVC发挥作用之前被初始化了,所以我在使用IoC容器将HttpContextBase
或HttpResponseBase
注入各种帮助的构造函数时遇到了问题模块使用。因此,我必须将HttpContextBase
传递给所述助手的方法 - 使用起来很费力并且感觉有点不对 - 或者创建这样的东西:
public class HttpContextProvider : IHttpContextProvider {
// ... ctor
public HttpContextBase GetContext() { return HttpContext.Current; }
}
然后,我会将实现IHttpContextProvider
的实例注入帮助程序,并在以后根据需要调用.GetContext()
。
直观地说,我觉得我可能做错了什么,但却无法真正理解它可能是什么。整个重构过程非常复杂 - 团队中的总线因素足够低 - 我对于这个问题请求过多的领导开发时间犹豫不决,从实际角度来看几乎可以看作是学术性的。
答案 0 :(得分:1)
我可以提出不同的选择
第二个选项仅在每次以相似的方式使用此对象时才有效 - 这样您就可以用2-3种ISmthProvider方法替换它。如果您总是以不同的方式使用对象,那么将两种方法结合起来并将最常用的用法提取到某些服务中以及在其他地方路径 Lazy< HttpContextBase> 到构造函数
在我看来,最好不要直接传递 HttpContext / HttpResponse ,因为它提供了太多东西的访问权限,后来人们可以把它弄得乱七八糟(使用它而不用考虑因为它已经存在)结果很难测试并在以后进行重构。