C# 将web上下文传递给';服务';在ASP MVC应用程序中

C# 将web上下文传递给';服务';在ASP MVC应用程序中,c#,.net,asp.net-mvc,tdd,mocking,C#,.net,Asp.net Mvc,Tdd,Mocking,我试图找到一种方法,将web当前http上下文传递给服务类(或者使用对它的引用初始化该类)。我这样做是为了将应用程序的其余部分从需要了解http上下文的任何内容中抽象出来 我还希望该服务可以使用TDD进行测试,可能使用一种可模拟的框架。因此,最好使用接口而不是实际的类 我想实现的一个例子: class WebInstanceService { private IHttpContext _Context; public WebInstanceService( .

我试图找到一种方法,将web当前http上下文传递给服务类(或者使用对它的引用初始化该类)。我这样做是为了将应用程序的其余部分从需要了解http上下文的任何内容中抽象出来

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

我想实现的一个例子:

class WebInstanceService 
{
    private IHttpContext _Context;        

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

    // Methods...
    public string GetInstanceVariable(string VariableName)
    {
         return _Context.Current.Session[VariableName];
    }
}
我遇到的一个主要问题是没有IHttpContext,.NETHTTP上下文是抽象类的一个子类,它不能被模仿(很容易?)

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

我可以使类成为静态的,并要求在调用时将上下文传递给每个函数

public static string GetInstanceVariable(string VariableName, HttpContext Context) 
{ ... }
但这并没有使该类更容易测试,我仍然需要创建一个HttpContext,另外,任何想要使用该类的非web感知服务突然需要能够检索上下文,要求它们与web服务器紧密耦合——这就是想要首先创建该类的全部原因

我愿意接受所有建议,尤其是那些人们知道有助于简化tdd测试的建议人们会建议我如何解决这个问题?


干杯

这就是引入HttpContextBase和HttpContextWrapper的原因。您可能希望使用HttpContextBase,并且在传入真实上下文时,使用
新的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];
    }
}

我们要做的是旋转其中一个

很简单,只要实例化一个HttpSimulator并填入值,HttpContext.Current就会被您指定的内容填满


IHttpContext是MVC中的东西,并且有一天会以webforms的形式出现。希望那天是.net 4

ASP.net附带System.Web.Abstracts,其中包括HttpContextBase,可用于在测试情况下处理HttpContext


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

这正是我想要做的,我不希望应用程序中的服务担心访问会话来检索数据,我宁愿它们通过WebInstanceService类。我甚至会质疑WebInstanceService。服务是否需要知道它来自web?