我最近开始使用 TDD 和依赖注入(inject)。这是一个重大的思维转变,我仍在努力将所有的碎片拼凑在一起。
我为所有业务逻辑提供了一个服务层,以使 Controller 尽可能精简。我的服务中的某些服务需要 HttpContext。创建服务以便进行单元测试的最佳方式是什么。
目前我有一个如下所示的 ServiceBase
public class HttpContextService
{
private HttpContextBase _ServiceContext;
public HttpContextBase ServiceContext
{
get
{
if (_ServiceContext == null)
_ServiceContext = new HttpContextWrapper(HttpContext.Current);
return _ServiceContext;
}
set { _ServiceContext = value; }
}
}
所以这意味着我的所有服务都可以继承这个服务。我为 HttpContextBase 创建属性的原因是这样我可以在对服务进行单元测试时设置它。 1. 有没有什么方法可以将 HttpContext 注入(inject)到 Unity Bootstrap 文件中的服务中。 ? 2.这是正确的方法还是我错过了什么?
提前致谢。就像我说的,我正在努力了解整个 TDD 依赖注入(inject)编码方式。
最佳答案
Some of the services in my service requires HttpContext
您的服务应该位于业务层,并且该层不应该了解您使用的表示技术。这允许您为不同的技术(例如 WCF Web 服务或 Windows 服务)重用此逻辑。但即使您不打算重用此代码,将您的服务与 HttpContextBase
紧密耦合仍然会增加复杂性,并使单元测试变得更加困难,正如您已经经历过的那样。
解决方案是从抽象背后的 HttpContextBase
中抽象出您想要的东西,而不是对整个 HttpContext
的抽象,而是对您想要的单个功能的抽象在特定情况下使用。
例如,当您想要访问 HttpContextBase.User
属性时,最好使用以下抽象:
public interface IUserContext
{
IIdentity Current { get; }
}
这使得测试更容易,您的服务更简单,并且为不同的应用程序创建不同的实现更简单。
关于asp.net-mvc - 在服务层使用HttpContextBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12050017/