【问题标题】:Pass HttpContext.Request parameter around or use static instance?传递 HttpContext.Request 参数或使用静态实例?
【发布时间】:2013-02-19 13:47:31
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 好的,Request.Params 在这里很有帮助,谢谢。与仅使用静态 HttpContext.Current.Request 相比,您这样做的原因是什么?
    • 我考虑过使用模型绑定器,但我在我的基本控制器上的重写 OnActionExecuting 方法中执行此逻辑,因为我需要确保在我的所有操作方法之前调用它。有没有办法从 OnActionExecuting 内部获取模型绑定创建的对象?
    • @Nick 因为那样你的工厂变得更难测试并且它与 HttpContext 紧密耦合。如果你传入一个 NameValueCollection,那么任何东西都可以使用这个工厂。
    • @Nick, HttpContext.Current?真的吗?你问的是单元测试:-) 永远不要在任何地方使用HttpContext.Current。并回答您的问题Is there a way to get the object created by model binding from inside OnActionExecuting:是的,有办法。只需从动作描述符上下文中读取它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2011-02-15
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多