gpt4 book ai didi

asp.net-mvc - 关于在 Controller 和扩展方法中访问 ASP.NET MVC Session[] 数据的建议?

转载 作者:行者123 更新时间:2023-12-04 17:46:48 24 4
gpt4 key购买 nike

我正在做一个 ASP.NET MVC 应用程序,我的一些操作方法和其他扩展方法需要访问用户数据。我用来获取用户的代码是:

this.currentUser = (CurrentUser)HttpContext.Session["CurrentUser"];

//and in the extension methods it's:

CurrentUser user = (CurrentUser)HttpContext.Current.Session["CurrentUser"];

同一行散布在我的许多 Controller 中的许多操作方法中。问题是这使得测试变得困难,而且看起来也不是很“优雅”。

谁能为这个解决方案提出一个好的 SOLID 方法?

谢谢

戴夫

最佳答案

您不应该将用户存储在 session 中。通过修改 web.config 或达到内存限制重新启动应用程序时, session 很容易丢失。这将在随机时刻注销用户。

没有理由不将 session 用于不同的目的(例如将元素存储在购物篮中)。你可以这样做:

首先我们定义接口(interface):

public interface ISessionWrapper
{
int SomeInteger { get; set; }
}

然后我们进行 HttpContext 实现:

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

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

public int SomeInteger
{
get { return GetFromSession<int>("SomeInteger"); }
set { SetInSession("SomeInteger", value); }
}
}

然后我们定义我们的基础 Controller :

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

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

最后:

public ActionResult SomeAction(int myNum)
{
SessionWrapper.SomeInteger
}

这将使测试变得容易,因为您可以在 Controller 测试中用 mock 替换 ISessionWrapper。

关于asp.net-mvc - 关于在 Controller 和扩展方法中访问 ASP.NET MVC Session[] 数据的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2213052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com