在 MVC3 应用程序中,我需要从传入的 Http 请求中包含的值构造一个域对象。逻辑非常复杂,以至于我创建了一个工厂类,负责创建我的域对象。
我的问题是是否将控制器的 Request 属性的值传递给这个工厂类,还是应该从工厂类内部引用静态 HttpContext.Request 属性的值?
我的目的是对控制器和工厂类进行单元测试,这样我就可以在某处执行必要的开销来设置 HttpContext。我只是想知道是否有任何一般规则要遵守?
在 MVC3 应用程序中,我需要从传入的 Http 请求中包含的值构造一个域对象。逻辑非常复杂,以至于我创建了一个工厂类,负责创建我的域对象。
我的问题是是否将控制器的 Request 属性的值传递给这个工厂类,还是应该从工厂类内部引用静态 HttpContext.Request 属性的值?
我的目的是对控制器和工厂类进行单元测试,这样我就可以在某处执行必要的开销来设置 HttpContext。我只是想知道是否有任何一般规则要遵守?
只需将 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 中,模型绑定器的职责就是:从请求中实例化一些模型。这样,您无需重新发明一些轮子,但您将为此目的使用框架中内置的内容。