C# 传递HttpContext.Request参数还是使用静态实例?
在MVC3应用程序中,我需要根据传入Http请求中包含的值构造域对象。逻辑非常复杂,我创建了一个工厂类,负责创建我的域对象 我的问题是,是将控制器的Request属性的值传递到此factory类中,还是应该从factory类内部引用静态HttpContext.Request属性的值C# 传递HttpContext.Request参数还是使用静态实例?,c#,asp.net-mvc,httprequest,httpcontext,C#,Asp.net Mvc,Httprequest,Httpcontext,在MVC3应用程序中,我需要根据传入Http请求中包含的值构造域对象。逻辑非常复杂,我创建了一个工厂类,负责创建我的域对象 我的问题是,是将控制器的Request属性的值传递到此factory类中,还是应该从factory类内部引用静态HttpContext.Request属性的值 我的目的是对控制器和工厂类进行单元测试,以便在某处执行设置HttpContext所需的开销。我只是想知道是否有什么一般规则需要遵守?只需将NameValueCollection传递给您的factory类: publi
我的目的是对控制器和工厂类进行单元测试,以便在某处执行设置HttpContext所需的开销。我只是想知道是否有什么一般规则需要遵守?只需将
NameValueCollection
传递给您的factory类:
public SomeDomainObject ConstructDomainObject(NameValueCollection data)
{
...
}
然后在控制器中,只需执行以下操作:
var domainModel = factory.ConstructDomainObject(Request.Params);
现在,您可以随心所欲地对ConstructDomainObject
方法进行单元测试
如果要单独测试控制器,请使此factory对象实现一个接口:
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中,模型绑定器的职责就是:从请求中实例化一些模型。通过这种方式,您不需要重新发明一些轮子,但您将使用框架中本机内置的东西来实现此目的。好的,请求。Params在这里非常有用,谢谢。与仅使用静态HttpContext.Current.Request相比,您这样做的原因是什么?我考虑过使用模型绑定器,但我在基本控制器上的重写OnActionExecuting方法中执行此逻辑,因为我需要确保在调用所有操作方法之前先调用它。有没有办法从OnActionExecuting内部获取由模型绑定创建的对象?@Nick,因为这样您的工厂就更难测试,而且它与HttpContext紧密耦合。如果您传入的是NameValueCollection,那么任何东西都可以使用此工厂。@Nick,
HttpContext.Current
?真正地您正在询问单元测试:-)不要在任何地方使用HttpContext.Current
。为了回答您的问题,有没有一种方法可以从操作执行的内部获取通过模型绑定创建的对象:是的,有一种方法。只需从操作描述符上下文中读取它。