【问题标题】:Passing web context to a 'service' in ASP MVC app将 Web 上下文传递给 ASP MVC 应用程序中的“服务”
【发布时间】:2008-12-02 12:57:04
【问题描述】:

我正在尝试找出一种将 Web 当前 http 上下文传递给服务类的方法(或使用对它的引用来初始化该类)。我这样做是为了将应用程序的其余部分从需要了解有关 http 上下文的任何信息中抽象出来。

我还希望服务可以使用 TDD 进行测试,可能使用 Mockable 框架之一。因此,最好使用接口而不是实际的类。

我想要实现的示例:

class WebInstanceService 
{
    private IHttpContext _Context;        

    public WebInstanceService( ... , IHttpContext HttpContext )
    {
        ....
        _Context = HttpContext;
    }

    // Methods...
    public string GetInstanceVariable(string VariableName)
    {
         return _Context.Current.Session[VariableName];
    }
}

我遇到的主要问题之一是没有 IHttpContext,.net http 上下文是无法模拟的抽象类的子类(容易吗?)。

另一个问题是我无法初始化类的全局实例,因为上下文与大多数请求无关。

我可以将类设为静态,并要求在调用时将 Context 传递给每个函数,即

public static string GetInstanceVariable(string VariableName, HttpContext Context) 
{ ... }

但这并没有使该类更容易测试,我仍然需要创建一个 HttpContext 并且另外任何想要使用该类的非 Web 感知服务突然需要能够检索需要它们的 Context与 Web 服务器紧密耦合——这就是首先要创建这个类的全部原因。

我对所有建议持开放态度——尤其是那些人们知道有助于轻松进行 tdd 测试的建议。 人们会建议我如何解决这个问题?

干杯

【问题讨论】:

    标签: c# .net asp.net-mvc tdd mocking


    【解决方案1】:

    这就是引入 HttpContextBase 和 HttpContextWrapper 的原因。您可能想要使用 HttpContextBase 并在传递真实上下文时使用new HttpContextWrapper( httpContext ),不过,我认为控制器中可用的内容已经是 HttpContextBase 类型。我每次都会在我的控制器中创建其中一个,而不是尝试从静态的全局 HttpContext.Current 实例中引用当前上下文。如果您在视图中需要它,请在 ViewData 中传递对强类型上下文的引用。

    我在测试中经常模拟 HttpContextBase。

    class WebInstanceService 
    {
        private HttpContextBase _Context;        
    
        public WebInstanceService( ... , HttpContextBase HttpContext )
        {
            ....
            _Context = HttpContext;
        }
    
        // Methods...
        public string GetInstanceVariable(string VariableName)
        {
             return _Context.Session[VariableName];
        }
    }
    

    【讨论】:

      【解决方案2】:

      我们所做的是旋转其中一个 http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx

      很简单,只需实例化一个 HttpSimulator 并填写值,然后 HttpContext.Current 就会填满您指定的任何内容。

      IHttpContext 是 MVC 中的东西,显然有一天会出现在 webforms 中。希望那一天是 .net 4

      【讨论】:

        【解决方案3】:

        ASP.NET 带有包含 HttpContextBase 的 System.Web.Abstractions,您可以使用它在测试情况下处理 HttpContext。

        我个人会抽象出对 HttpContext 的直接依赖。

        【讨论】:

        • 这正是我想要做的,我不希望我的应用程序中的服务不必担心访问会话来检索数据,我宁愿他们通过 WebInstanceService 类。
        • 我什至会质疑 WebInstanceService。服务是否需要知道它来自网络?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        相关资源
        最近更新 更多