2016-10-04 50 views
0

好吧,我会尽量让事情变得简单明了。你可能知道,我有我的数据库使用EntityFramework,然后我有我的数据库模型类被数据库初始化,然后我有我的视图模型,我有每个html控件的字段,在过去的我让我的Controller使用特定的ViewModel实例。什么时候从数据库更新ViewModel [缓存视图模型]

我的问题是,视图模型是我控制器上创建一次(任何动作)的要求,在其他时候,我总是检查它是否是空的,如果它是空然后我重建视图模型获取数据从数据库使用我的数据库模型类,这是正确的做法是正确的?所以我可以在性能上得到改善..对吧?因为我正在重复使用View Model而不是每次都创建它......?

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

1)我的视图模型对象上设置一个寿命(分钟/小时) 控制器内(到期一次我将它设置为null)。

2)I尝试处理CTRL + F5键组合和我控制器设置为空内部的视图模型 对象。

3)我重建视图模型每个HTTP请求到控制器(这 是如此糟糕...)

4)我在每个客户端化HTTP会话,当后台更新一个 场,每个HTTP在我的ASP.NET WebApplication的会话中获取的触发 与一些标志设置视图模型对象为null(我甚至不知道 这是可能的,但似乎是最优雅的方式,对不对?

这是我目前正在做的一个例子,但在某些情况下,我可能需要重新考虑创建视图模型(因为数据库视野改变):

[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.. 
} 

期待听听你的回应和反馈, 这primarly专注于性能和CPU时间的优化问题,我想我的客户有一个新的,使用我的网站清洁和快速的体验。

谢谢!

编辑:用更多的信息编辑的问题。

+1

你是什么意思_on其他时间我总是检查它是否为null_?你是否在'Session'中存储了你的视图模型(以及为什么?)。是什么让你认为在每个请求上初始化你的视图模型是不好的? –

+0

嗨@StephenMuecke感谢您的回复。我的意思是我做了一些像检查模型为null的东西,在这种情况下,我再次构建模型,你明白了吗?无论如何,我并没有存储模型,模型只是继续从控制器视图到视图控制器,我在我的动作方法参数中接收模型。我说初始化我的视图模型是坏的,因为我会在数据完全没有改变的情况下使用CPU ...所以我可以使用已经存在于模型视图对象中的相同字段... – TiagoM

+0

何时何地检查它是否为null? (对不起,但你的问题没有意义) –

回答

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.. 
} 
+0

感谢您的输入Alexey!我正在寻找这个,它真的帮助我,你能告诉我一件事吗?也许可以用你对此的回答编辑你的答案?问题是:“服务器,我的意思是,具有特定角色(后台)的用户是否可以在Controller中调用特定的操作来触发所有客户端缓存设置为空?因此,我不需要等待到期并且在对模型对象进行下一次检查后立即刷新数据?谢谢! – TiagoM

+1

@DarkLink,我已经更新了我的回答。 –

+0

是的没错,我知道这是做到这一点的方法,我的问题是,是否会删除缓存记录的用户权限?不是每个人在那个时候使用缓存浏览网站的权利?也许这是太愚蠢的问,甚至不可能......但为了让你明白,我想触发此操作(resetcache)到大家在特定时刻浏览... – TiagoM

相关问题