好的,所以我会尽量简短明了。
正如您可能知道的,我使用EntityFramework创建了数据库,然后我的数据库模型类被数据库初始化,然后我的视图模型中我有每个html控件的字段,最后我有我的Controller与一个特定的ViewModel实例。
我的问题是,视图模型在我的控制器(任何操作)请求上创建一次,另一次我总是检查它是否为空,如果它为null则我使用我的数据库模型类重建View Model从数据库中获取数据,这是正确的做法吗?所以我可以对性能进行改进..对吗?因为我重复使用View模型而不是每次都创建它??
当一些字段由后台管理员更新时,问题就出现了。 我怎么能克服这个?我看到以下选项:
1)在我的ViewModel对象中设置一个生命周期(分钟/小时) 控制器(一旦过期我将其设置为null)。
2)我尝试处理 CTRL + F5 组合键并设置ViewModel 控制器内的对象为null。
3)我将每个http请求重建ViewModel到控制器(这个 太糟糕了......)
4)当后台更新a时,我使用每个客户端的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时间优化上,我希望我的客户能够使用我的网站获得全新,干净和快速的体验。
谢谢!
编辑:问题编辑了更多信息。
答案 0 :(得分:2)
默认情况下,ASP.NET MVC控制器会在每个请求上实例化。这意味着每个请求的indexModel
变量始终为null
。网络是无状态的,因此您几乎没有选择在请求之间存储信息。
客户端
服务器端
据我所知,您使用的是某些数据库,只是希望阻止在每次请求时将查询发送到数据库以获得更好的性能。其中一个选项是使用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..
}