0

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

我的问题是是否将控制器的 Request 属性的值传递给这个工厂类,还是应该从工厂类内部引用静态 HttpContext.Request 属性的值?

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

4

1 回答 1

2

只需将 a 传递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 中,模型绑定器的职责就是:从请求中实例化一些模型。这样,您无需重新发明一些轮子,但您将为此目的使用框架中内置的内容。

于 2013-02-19T13:49:27.820 回答