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