【问题标题】:When to Update the ViewModel from Database [Caching ViewModel]何时从数据库更新 ViewModel [缓存 ViewModel]
【发布时间】:2017-02-13 04:30:46
【问题描述】:

好的,所以我会尽量让事情简短明了。

您可能知道,我有使用 EntityFramework 的数据库,然后我有由数据库初始化的数据库模型类,然后我有我的视图模型,其中我有每个 html 控件的字段,最后我有我的控制器具有特定的 ViewModel 实例。

我的问题是,视图模型是在我的控制器(任何操作)请求中创建一次,其他时候我总是检查它是否为空,如果它为空,那么我重建视图使用我的数据库模型类从数据库中获取数据的模型,这是正确的做法吗?所以我可以提高性能..对吗?因为我正在重用 View Model 而不是每次都创建它...?

当后台管理员更新某些字段时,问题就出现了。 我该如何克服呢?我看到以下选项:

1) 在我的 ViewModel 对象上设置生命周期(分钟/小时) 控制器(一旦过期,我将其设置为 null)。

2) 我尝试处理 CTRL+F5 组合键并设置 ViewModel 控制器内的对象为空。

3) 我对控制器的每个 http 请求都重建 ViewModel(这个 太糟糕了...)

4) 我使用每个客户端的 Http Session,当后台更新一个 字段,我的 ASP.NET WebApplication 上的每个 Http 会话都被触发 带有一些标志将 View Model 对象设置为 null (我什至不知道 如果这是可能的,但它似乎是最优雅的方式,对吧?

这是我目前正在做的一个示例,但在某些情况下,我可能需要重新创建 ViewModel(因为 View 字段的数据库已更改):

    [Authorize]
    public class HomeController : Controller
    {
        private IndexViewModel indexModel;

        [Authorize]
        public ActionResult Index(IndexViewModel model, string lang = "en")
        {
            indexModel = model;
            if (indexModel == null)
                indexModel = new IndexViewModel();

            indexModel.SelectedLanguage = lang;

            return View(indexModel);
        }

       //more actions..
}

期待听到您的所有回复和反馈, 这是一个主要关注性能和 CPU 时间优化的问题,我希望我的客户在使用我的网站时获得全新、干净和快速的体验。

谢谢!

编辑:用更多信息编辑问题。

【问题讨论】:

  • 你是什么意思在其他时候我总是检查它是否为空?您是否将视图模型存储在 Session 中(为什么?)。是什么让你认为在每个请求上初始化你的视图模型是不好的?
  • 嗨@StephenMuecke 感谢您的回复。我的意思是我做了一些检查模型是否为空的事情,在这种情况下,我再次构建模型,你明白了吗?无论如何我都没有存储模型,模型只是不断地从控制器视图到视图控制器,我在我的操作方法参数中接收模型。我说初始化我的视图模型很糟糕,因为在数据根本没有改变的情况下我将使用 CPU...所以我可以使用模型视图对象中已经存在的相同字段...
  • 我的理解是您正在尝试使您的视图模型保持最新,但您不想在每个到达控制器的 http 请求上查询数据库。是这个意思吗?
  • @DarkLink,我不会那样做。如果您想在对控制器的请求之间存储视图模型的状态,最好将其保存到Cache 对象并为其设置过期策略。然后你可以检查对象是否在缓存中可用,如果没有初始化它并从数据库中更新它。
  • 您需要在 url 中包含模型的所有属性的值。但这真的没有任何意义,也不清楚你试图用这段代码做什么。网络是无状态的。当您发出请求时,会创建一个新的控制器实例,indexModel 的值将始终为 null。如果你没有在 url 中传递你的模型的值,那么model 只是IndexViewModel 的一个新实例。所以你可以删除第 1 3 行代码,只使用model.SelectedLanguage = lang; return View(model);

标签: c# asp.net-mvc performance caching model


【解决方案1】:

默认情况下,每个请求都会实例化 ASP.NET MVC 控制器。这意味着您的 indexModel 变量在每次请求时将始终为 null。 Web 是无状态的,因此您几乎没有选择在请求之间存储信息。

客户端

  • 饼干
  • 隐藏字段

服务器端

  • 数据库或其他存储
  • 会话
  • 缓存

据我了解,您使用了一些数据库,只是想防止在每次请求时将查询发送到数据库以实现更好的性能。一种选择是使用System.Web.Caching.Cache 对象。然后你就可以写出类似的东西了。

public class HomeController : Controller
{
    [Authorize]
    public ActionResult Index(string lang = "en")
    {
        IndexViewModel indexViewModel;
        if (HttpContext.Cache["IndexViewModel"]!=null) 
        {
            indexViewModel = HttpContext.Cache["IndexViewModel"];
        }
        else 
        {
            // get your index view model from database by calling some service or repository
            indexViewModel = DatabaseService.GetIndexViewModelFromDatabase();
            // once we got the view model from a database we store it to cache and set it up so that it gets expired in 1 minute
            HttpContext.Cache.Insert("IndexViewModel", indexViewModel, null, DateTime.UtcNow.AddMinutes(1), Cache.NoSlidingExpiration);
        }

        indexViewModel.SelectedLanguage = lang;

        return View(indexModel);
    }

   [HttpPost]
   [Authorize(Roles="Backoffice")]
   public ActionResult ResetCache(string cacheKey)
   {
       if (HttpContext.Cache[cacheKey] != null)
           HttpContext.Cache.Remove(cacheKey);
   }
   //more actions..
}

【讨论】:

  • 感谢您的意见,Alexey!我一直在找这个,它对我很有帮助,你能告诉我一件事吗?也许用你的答案来编辑你的答案?问题是:“服务器,我的意思是,具有特定角色(后台)的用户可以调用控制器中的特定操作,触发所有客户端的缓存设置为 null 吗?所以我不需要等待过期,下次检查模型对象后立即刷新数据?谢谢!
  • 是的,没错,我知道这样做的方法,我的问题是,这会删除登录用户的缓存吗?那时不是每个人都使用缓存浏览网站吗?也许这太愚蠢了,甚至不可能问...但是为了让您理解,我想触发这个操作(resetcache)给在那个特定时刻浏览的每个人...
  • @DarkLink,根据documentation,每个应用程序域都会创建一个Cache 实例。这意味着它对您的所有用户都是通用的,因此如果您将某些内容放入/从缓存中删除,这将影响您的所有用户。如果您的视图模型应该包含一些特定于用户的信息,您可以将键“IndexViewModel”更改为“IndexViewModel_xx”,其中 xx 是当前登录用户的唯一 ID 或电子邮件。这样就可以为每个用户单独重置或设置缓存。
  • 非常感谢@AlexeyAndrushkevich!这正是我要找的! :)
猜你喜欢
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多