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

C# 在单独的帮助器类中访问控制器外部的HttpContext会话的最佳实践,c#,asp.net-mvc,asp.net-mvc-3,session,httpcontext,C#,Asp.net Mvc,Asp.net Mvc 3,Session,Httpcontext,在单独的helper类中访问控制器外部的HttpContext会话是一种好的做法吗 ==================== 控制器是否应该承担从会话获取数据并传输到帮助器类的所有责任 范例 HomeController : BaseController { var value1 = Httpcontext.Session["key1"]; var value2 = Httpcontext.Session["key2"]; var val... CallAMeth

在单独的helper类中访问控制器外部的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();
   }
}
公共接口ISessionWrapper
{
T GetFromSession(字符串键);
SetInSession(字符串键、对象值);
}
公共类HttpContextSessionWrapper:ISessionWrapper
{
私有T GetFromSession(字符串键)
{
返回(T)HttpContext.Session[key];
}
私有void SetInSession(字符串键、对象值)
{
HttpContext.Session[key]=值;
}
}
公共类BaseController:控制器
{
公共ISessionWrapper会话包装器{get;set;}
公共BaseController()
{
SessionWrapper=新的HttpContextSessionWrapper();
}
}

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

这两种方法都有起伏


  • 直接使用HttpContext

    • 加快发展

    • 需要一些关于考试的想法。Nemely是模拟HttpContext的能力。可在网上使用图书馆


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

    • 发展缓慢

    • 需要在访问HttpContext方面“重新发明轮子”

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


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

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


编辑以添加


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

你好,保罗,谢谢你的回答。另一个问题是,控制器是否应承担从会话中获取数据并将其传输到助手类的所有责任?您发布数据的方式,似乎在问什么是处理访问HttpContext的最佳方式。