asp.net-mvc - 在服务层使用HttpContextBase

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

我最近开始使用 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/

相关文章:

asp.net - Azure 网站上脚本/样式的长时间等待 (TTFB) 时间

asp.net-mvc - 添加 Controller 对话框 : Filter down the list of Types

python - 使用 ImageField 对 Django ModelForm 进行单元测试,测试显示无效表单

c# - 静态方法的函数式编程建议如何影响可测试性?

javascript - AngularJS:如何在配置阶段使用 $q 进行单元测试?

c# - 在 WebApi 或 MVC Controller 中使用 ConfigureAwait(false) 有什么危险吗?

c# - 操作过滤器中的 session 变量

gradle - 无法获得分类依赖

php - 适配器和依赖注入(inject)

jakarta-ee - JAX-RS 中未发生 @Resource 注入(inject)