ASP.NET MVC 会话、全局和缓存

2024-01-27

我有一个用普通 ASP.NET 编写的应用程序,我想将其移植到 ASP.NET MVC。

然而,我对保存对象的正确位置感到困惑。我需要坚持有几个原因:

  1. 我希望所有人都能拥有一个single数据库连接,包装在“存储库”或“管理器”样式对象中。
  2. 每个用户都有一个需要按会话保存的用户对象。

通常,我会说 #1 将被保存为 Globals.asax 中的静态项目,可以使用Global.Repository或类似的。

我通常会说#2 应该是在页面基类中的某个位置具有会话后备存储的属性。

现在我感到困惑的原因是我听说 MVC 中的会话发生了变化,并且 Global.asax 不再拥有相同的类。另外,页面的概念已被删除,因此向控制器的基类添加属性似乎......错误。

你们说什么?


您的数据库将位于控制器的基类中。这个基类应该扩展 Controller,并且所有控制器都应该扩展基类。这是一个小例子:

public class BaseController : Controller
{
    private AuthServices _auth;
    private LogHelper _log;
    private Repository _repository;

    /// <summary>
    /// <see cref="AuthServices"/>
    /// </summary>
    protected AuthServices Authorization
    {
        get { return _auth ?? (_auth = new AuthServices()); }
    }

    /// <summary>
    /// <see cref="LogHelper"/>
    /// </summary>
    protected LogHelper Log
    {
        get { return _log ?? (_log = new LogHelper()); }
    }

    /// <summary>
    /// <see cref="Repository"/>
    /// </summary>
    protected Repository Repository
    {
        get { return _repository ?? (_repository = new Repository()); }
    }
}

注意惰性实例化。这使我可以在运行测试之前潜入并使用模拟设置我的私有字段。

至于会话,您的 User 对象仍然可以保存在会话中,就像在传统的 ASP.NET 应用程序中一样。几乎所有内容都仍然存在(响应、缓存、会话等),但其中一些已使用 System.Web.Abstractions 中的类进行包装,以便可以模拟它们进行测试。它们的行为方式仍然相同,尽管您不应该在其传统角色中使用其中一些(例如,不要 Response.Redirect,返回一个 ActionResult,例如执行重定向的 RedirectToRouteResult)。

至于你的问题背后的原因......

不要强调单个数据库连接。根据您的实现,这甚至可能是一个坏主意,因为请求可能会相互干扰。只需打开您的连接器,使用它,然后在完成后丢弃/关闭它。

而且,MVC 带来的最大变化之一是拒绝了传统 ASP.NET 试图给 Web 开发带来的有状态模型。所有框架和视图状态都不再存在(不要注意幕后的人)。您保留的状态越少,您的 Web 应用程序就越不复杂且更健壮。尝试一下,你可能会喜欢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC 会话、全局和缓存 的相关文章

随机推荐