c# - 在单独的帮助程序类中访问 Controller 外部的 HttpContext session 的最佳实践

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

在单独的帮助程序类中访问 Controller 外部的 HttpContext session 是一种好习惯吗?

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

Controller 是否应该承担从 session 中获取数据并传输到辅助类的所有责任

例子

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 的负担)。

这两种方法都有优缺点。


  • 直接使用 HttpContext

    • 开发速度更快

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


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

    • 发展较慢

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

    • 需要编写和维护更多代码


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

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


编辑添加

为了回答问题的核心(在 OP 的唠叨之后), Controller 应该始终管理数据收集,然后再将它们传递给执行器。

关于c# - 在单独的帮助程序类中访问 Controller 外部的 HttpContext session 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6314530/

相关文章:

c# - 在 C# 中自动完成所有建议的三元搜索树

c# - FxCop - 在适当的地方使用属性

c# - 将按钮事件等转换为 ASP.NET MVC

asp.net-mvc - 在 MVC3 View 中输入后显示度量单位的好方法是什么?

c# - 在 MVC cshtml 中每行显示三列

c# - 网络核心/身份服务器: unable to logout

c# - 如何将 Html 转换为 UWP 的 Xaml

c# - 这是 MVC 框架中的错误吗

.net - 如何对 JsonArray 进行排序

c# - MVC 3 - 按行显示项目集合