在单独的帮助程序类中访问控制器外部的HttpContext会话的最佳实践

时间:2011-06-11 06:41:44

标签: c# asp.net-mvc asp.net-mvc-3 session httpcontext

在单独的帮助程序类中访问控制器外部的HttpContext会话是一个好习惯吗?

====================

控制器是否应承担从会话中获取数据并转移到帮助程序类的所有责任

实施例

HomeController : BaseController
{
    var value1 = Httpcontext.Session["key1"];
    var value2 = Httpcontext.Session["key2"];
    var val...
    CallAMethod(value1,value2,val...);
}

或者它应该模拟HttpContextBase并使用它,如下所示?

HomeController : BaseController
{
    //Use Dependency Injection pattern
    CallAMethod(base.SessionWrapper);
}

ISessionWrapper的实现是

public interface ISessionWrapper
{
     T GetFromSession<T>(string key);
     SetInSession(string key, object value);
}

public class HttpContextSessionWrapper : ISessionWrapper
{
   private T GetFromSession<T>(string key)
   {
      return (T) HttpContext.Session[key];
   }

   private void SetInSession(string key, object value)
   {
      HttpContext.Session[key] = value;
   }
}

public class BaseController : Controller
{
   public ISessionWrapper SessionWrapper { get; set; }

   public BaseController()
   {
      SessionWrapper = new HttpContextSessionWrapper();
   }
}

1 个答案:

答案 0 :(得分:1)

显然,您希望在代码中具有一些可测试性(毕竟这就是为什么您要承担创建ISessionWrapper的负担)。

这两种方法都有起伏不定。


  • 直接使用HttpContext

    • 更快开发

    • 在测试课上需要一些想法。 Nemely能够模拟HttpContext。可在NET上使用库。


  • 使用依赖注入(ISessionWrapper):

    • 发展较慢

    • 需要“重新发明轮子”才能访问HttpContext

    • 要编写和保存更多代码


所以,我会思考两种方法的利弊,并根据我的目标来决定。

但是,就个人而言,我会选择需要少量代码编写的路径。


已编辑添加

在回答问题的核心时(在OP唠叨之后),控制器应始终在将数据传递到执行器之前对其进行管理。