【问题标题】:how to decouple controller from Http context session如何将控制器与 Http 上下文会话解耦
【发布时间】:2011-03-24 17:32:32
【问题描述】:

我需要在我的操作中的会话中存储一些数据,但是我担心将我的控制器耦合到 http 上下文会话,我曾考虑过创建一个服务,但这真的值得吗?

【问题讨论】:

    标签: asp.net-mvc inversion-of-control loose-coupling


    【解决方案1】:

    不,不值得。它是可以访问包括会话在内的 Http 上下文的控制器。更不用说您已经在处理会话的抽象:HttpSessionStateBase,它可以在单元测试中轻松模拟。

    在某些情况下,您可以让业务方法将ICollection 作为输入参数,这是由HttpSessionStateBase 实现的接口,然后让控制器将Session 对象传递给它们。

    【讨论】:

    • 那么我应该调用 Session["my session key"] = myvalue 吗?
    • @ryudice,是的,这是控制器操作中完全有效的代码。
    • 直到您尝试为该 HttpContextBase 和子项设置动态模拟并弄清楚它是什么单元测试维护的噩梦。然后你就会明白为什么进一步解耦肯定是值得的。
    • @Mark Seemann,不,我没有这样的问题。有了MVCContrib TestHelper 之类的东西,生活很容易:-)
    【解决方案2】:

    特别是对于ApiControllers,为自己建立一个DelegatingHandler,并将你所有的好东西推送到request.Properties。然后,无论您是在测试还是实时运行,您都可以从您的请求中检索它们。这样做的好处是,您对 Controller 中的 Session 的依赖性为零。

    消息处理程序

    public class ContextHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            // get the goodies to add onto the request
            var goodies = /* call to goodieGoodieYumYum */
    
    
            // add our goodies onto the request
            request.Properties.Add(Constants.RequestKey_Goodies, goodies);
    
            // pass along to the next handler
            return base.SendAsync(request, cancellationToken);
        }
    }
    

    控制器动作

    var goodies = (List<Goodie>)Request.Properties[Constants.RequestKey_Goodies];
    

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2019-01-22
      • 1970-01-01
      • 2022-11-18
      • 2016-04-04
      • 1970-01-01
      相关资源
      最近更新 更多