gpt4 book ai didi

c# - 在 ASP.NET MVC 站点中实现 Session 的公认模式是什么?

转载 作者:太空狗 更新时间:2023-10-29 22:04:03 24 4
gpt4 key购买 nike

显然,典型的 WebForms 方法行不通。如何在 MVC 世界中跟踪用户?

最佳答案

Session 的工作方式与它在 Webforms 中的工作方式完全相同。如果要存储简单信息,请使用表单例份验证 cookie。如果你想存储购物车的内容,Session 是你要去的地方。我写了一篇关于 using Session with ASP.NET 的博客条目:

假设我们想在 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); }
}
}

GetFromSession 和 SetInSession 是辅助方法,可以更轻松地获取和设置 Session 中的数据。 SomeInteger 属性使用这些方法。

然后我们定义我们的基础 Controller (适用于 ASP.NET MVC):

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

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

如果您想在 Controller 外部使用 Session,只需创建或注入(inject)新的 HttpContextSessionWrapper()。

您可以在 Controller 测试中将 SessionWrapper 替换为 ISessionWrapper 模拟,因此它不再依赖于 HttpContext。 Session 也更易于使用,因为您调用的不是 (int)Session["SomeInteger"],而是 SessionWrapper.SomeInteger。它看起来更好,不是吗?

您可能会想创建覆盖 Session 对象的静态类,并且不需要在 BaseController 中定义任何接口(interface)或初始化,但它失去了一些优势,特别是在测试和替换为其他实现时。

关于c# - 在 ASP.NET MVC 站点中实现 Session 的公认模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2390623/

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