2

我最近开始使用 TDD 和依赖注入。这是一个很大的心态变化,我仍在努力将所有部分拼凑在一起。

我有一个用于所有业务逻辑的服务层,以使控制器尽可能薄。我的服务中的某些服务需要 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注入Unity Bootstrap文件中的服务。? 2.这是正确的方法还是我错过了什么?

提前致谢。就像我说的,我正在努力理解整个 TDD 依赖注入的编码方式。

4

1 回答 1

3

我的服务中的一些服务需要HttpContext

您的服务应该存在于业务层中,并且该层不应该有您使用的表示技术的概念。这允许您将此逻辑重用于不同的技术(例如 WCF Web 服务或 Windows 服务)。但是,即使您不打算重用此代码,将您的服务紧密耦合到HttpContextBase仍然会增加复杂性,并使单元测试变得更加困难,正如您已经经历的那样。

解决方案是从HttpContextBase后面的抽象中抽象出你想要的东西,而不是对完整的抽象HttpContext,而是对你想在特定情况下使用的单个功能的抽象。

例如,当您想访问该HttpContextBase.User属性时,最好使用以下抽象:

public interface IUserContext
{
    IIdentity Current { get; }
}

这使测试更容易,您的服务更简单,并且为不同的应用程序创建不同的实现更简单。

于 2012-08-21T11:57:16.283 回答