传递HttpContext.Request参数或使用静态实例?

时间:2013-02-19 13:47:32

标签: c# asp.net-mvc httprequest httpcontext

在MVC3应用程序中,我需要根据传入的Http请求中包含的值构造域对象。逻辑非常复杂,我创建了一个工厂类,负责创建我的域对象。

我的问题是,是否要将此工厂类的值传递给Controller的Request属性,还是应该从工厂类中引用静态HttpContext.Request属性的值?

我的目的是对控制器和工厂类进行单元测试,这样我就可以在某处设置HttpContext。我只是想知道是否有任何一般规则要坚持下去?

1 个答案:

答案 0 :(得分:2)

只需将NameValueCollection传递给您的工厂类:

public SomeDomainObject ConstructDomainObject(NameValueCollection data)
{
    ...
}

然后在您的控制器中:

var domainModel = factory.ConstructDomainObject(Request.Params);

现在,您可以根据需要对ConstructDomainObject方法进行单元测试。

如果要单独测试控制器,请让此工厂对象实现一个接口:

public interface IMyFactory
{
    SomeDomainObject ConstructDomainObject(NameValueCollection data);
}

您的控制器将使用:

public class SomeController: Controller
{
    private readonly IMyFactory factory;  
    public SomeController(IMyFactory factory)
    {
        this.factory = factory;
    }

    public ActionResult SomeAction()
    {
        var domainModel = this.factory.ConstructDomainObject(Request.Params);
        ...
    }
}

所有这些都说,您是否考虑过编写自定义模型绑定器?在ASP.NET MVC中,模型绑定器的职责就是:从请求中实例化一些模型。这样你就不需要重新发明一些轮子了,但是你将使用框架中原生的内容来实现这个目的。