在单独的帮助程序类中访问 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/