何时从数据库更新ViewModel[缓存ViewModel]

本文关键字:ViewModel 缓存 更新 数据库 何时 | 更新日期: 2023-09-27 18:11:27

好的,我会尽量让事情变得简单明了。

你可能知道,我有我的数据库使用EntityFramework,然后我有我的数据库模型类得到数据库初始化,然后我有我的视图模型,我有每个html控件的字段,在最后我有我的控制器与一个特定的ViewModel实例。

我的问题是,视图模型是创建一旦在我的控制器(任何动作)请求,在其他时候我总是检查它是否为空,如果它是空的,然后我重建视图模型从数据库中获取数据使用我的数据库模型类,这是正确的事情要做对吗?这样我的表现就会有所提高。对吧?既然我重用视图模型,而不是每次都创建它…?

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

1)在我的ViewModel对象上设置一个生存期(分钟/小时)

2)我尝试处理CTRL+F5键组合,并设置ViewModel对象设置为null。

3)我重建ViewModel每个http请求到控制器(这)

4)当后台更新a时,我使用每个客户端的Http会话字段,我的ASP上的每个Http会话。. NET WebApplication get被触发用一些标志来设置视图模型对象为空(我甚至不知道)如果这是可能的,但这似乎是最优雅的方式,对吧?

下面是我正在做的一个例子,但在某些情况下,我可能需要重新创建ViewModel(因为视图字段的数据库发生了变化):

    [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时间优化上,我希望我的客户使用我的网站有一个新鲜,干净和快速的体验。

谢谢!

编辑:问题编辑了更多信息

何时从数据库更新ViewModel[缓存ViewModel]

NET MVC控制器在每个请求上都被实例化。这意味着您的indexModel变量在每个请求上将始终是null。web是无状态的,所以你很少有选项来存储请求之间的信息。

客户端

    饼干
  • 隐藏字段
服务器端

  • 数据库或其他存储
  • <
  • 会话/gh>缓存

据我所知,你使用一些数据库,只是想防止查询被发送到数据库的每一个请求,以实现更好的性能。其中一种选择是使用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..
}