何时从数据库更新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时间优化上,我希望我的客户使用我的网站有一个新鲜,干净和快速的体验。
谢谢!
编辑:问题编辑了更多信息
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..
}