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

本文关键字:HttpContext 外部 会话 控制器 最佳 访问 单独 访问控制 | 更新日期: 2023-09-27 17:59:06

在单独的助手类中访问控制器外部的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();
   }
}

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

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

这两种方法都有起有落。


  • 直接使用HttpContext

    • 更快地开发

    • 需要一些关于测试课的想法。Nemely模拟HttpContext的能力。可与NET上可用的库一起使用。


  • 使用依赖项注入(ISessionWrapper):

    • 开发速度较慢

    • 需要"重新发明轮子"访问HttpContext

    • 还有很多代码需要编写和维护


因此,我会考虑这两种方法的利弊,并根据我的目标做出决定。

然而,就我个人而言,我会选择需要更少代码才能编写的路径。


编辑为添加

为了回答问题的核心(在OP发出唠叨之后),控制器应始终在将数据传递给致动器之前管理数据收集。