C# 何时从数据库更新ViewModel[缓存ViewModel]
好的,我会尽量把事情简短明了 您可能知道,我有使用EntityFramework的数据库,然后有由数据库初始化的数据库模型类,然后有视图模型,其中有每个html控件的字段,最后有带有特定ViewModel实例的控制器 我的问题是,视图模型在我的控制器(任何操作)请求下创建一次,另一次我总是检查它是否为null,如果为null,那么我使用我的数据库模型类从数据库中提取数据来重建视图模型,这是正确的做法,对吗?这样我就可以在性能上有所提高。。正确的?因为我正在重用视图模型,而不是每次都创建它 当后台管理员更新某个字段时,就会出现问题。 我怎样才能克服这个问题?我看到以下选项: 1) 在中设置我的ViewModel对象的生存期(分钟/小时) 控制器(一旦过期,我将其设置为null) 2) 我尝试处理CTRL+F5组合键,并设置ViewModel 将控制器内的对象设置为null 3) 每次向控制器发出http请求时,我都会重建ViewModel(此 太糟糕了……) 4) 我使用每个客户端的Http会话,当后台更新 字段,则会触发ASP.NET Web应用程序上的每个Http会话 使用一些标志将视图模型对象设置为null(我甚至不知道 如果这是可能的,但这似乎是最优雅的方式,对吗 下面是我目前正在做的一个示例,但在某些情况下,我可能需要重新创建ViewModel(因为视图字段的数据库已更改): 期待您的回复和反馈, 这是一个主要关注性能和CPU时间优化的问题,我希望我的客户使用我的网站有一个新鲜、干净和快速的体验 谢谢大家!C# 何时从数据库更新ViewModel[缓存ViewModel],c#,asp.net-mvc,performance,caching,model,C#,Asp.net Mvc,Performance,Caching,Model,好的,我会尽量把事情简短明了 您可能知道,我有使用EntityFramework的数据库,然后有由数据库初始化的数据库模型类,然后有视图模型,其中有每个html控件的字段,最后有带有特定ViewModel实例的控制器 我的问题是,视图模型在我的控制器(任何操作)请求下创建一次,另一次我总是检查它是否为null,如果为null,那么我使用我的数据库模型类从数据库中提取数据来重建视图模型,这是正确的做法,对吗?这样我就可以在性能上有所提高。。正确的?因为我正在重用视图模型,而不是每次都创建它 当后台
编辑:用更多信息编辑问题。默认情况下,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..
}
默认情况下,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..
}
其他时候我总是检查它是否为空,这是什么意思?您是否将视图模型存储在
会话中(为什么?).是什么让你认为在每个请求上初始化视图模型是不好的?嗨@StephenMuecke谢谢你的回复。我的意思是我做了一些类似于检查模型是否为空的事情,在这种情况下,我再次构建模型,你明白了吗?反正我没有存储模型,模型只是从一个控制器视图一直运行到另一个视图控制器,我收到在我的操作方法参数中使用e模型。我说初始化我的视图模型是不好的,因为在数据根本没有更改的情况下,我将使用CPU…因此我可以使用模型视图对象中已经存在的相同字段…我的理解是,您正试图使视图模型保持最新,但您永远不想查询数据库y http请求到达控制器。这是你的意思吗?@Darkink,我不会这样做。如果你想在控制器请求之间存储视图模型的状态,最好将其保存到缓存对象,并为其设置过期策略。然后你可以检查该对象在缓存中是否可用,以及是否有not初始化它并从数据库更新它。你需要在url中包含你模型的所有属性的值。但是这真的没有意义,也不清楚你试图用这些代码做什么。web是无状态的。当你发出请求时,会创建一个控制器的新实例,并且indexModel
w的值我将始终为null
。如果您没有在url中传递模型的值,那么model
只是IndexViewModel
的一个新实例。因此您可以删除前3行代码,只需使用model.SelectedLanguage=lang;返回视图(model)
其他时候我总是检查它是否为空,这是什么意思?您是否将视图模型存储在会话中(为什么?).是什么让你认为在每个请求上初始化视图模型是不好的?嗨@StephenMuecke谢谢你的回复。我的意思是我做了一些类似于检查模型是否为空的事情,在这种情况下,我再次构建模型,你明白了吗?反正我没有存储模型,模型只是从一个控制器视图一直运行到另一个视图控制器,我收到我说初始化我的视图模型是不好的,因为我会在数据不正确的情况下使用CPU