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

时间:2016-10-04 21:19:03

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

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

正如您可能知道的,我使用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时间优化上,我希望我的客户能够使用我的网站获得全新,干净和快速的体验。

谢谢!

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

1 个答案:

答案 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..
}