【问题标题】:Using HttpContextBase in Service Layer在服务层使用 HttpContextBase
【发布时间】:2012-08-16 12:18:15
【问题描述】:

我最近开始使用 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 依赖注入的编码方式。

【问题讨论】:

  • 您的服务中需要HttpContext 的哪些功能?

标签: asp.net-mvc unit-testing dependency-injection unity-container service-layer


【解决方案1】:

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

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

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

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

public interface IUserContext
{
    IIdentity Current { get; }
}

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

【讨论】:

  • 嗨,谢谢。首先我为 HttpContext 创建了一个包装类,但我知道这可能会变得混乱。所以我开始只抽象我需要的东西。
猜你喜欢
  • 2012-05-11
  • 2010-11-16
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多