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

C# 何时从数据库更新ViewModel[缓存ViewModel],c#,asp.net-mvc,performance,caching,model,C#,Asp.net Mvc,Performance,Caching,Model,好的,我会尽量把事情简短明了 您可能知道,我有使用EntityFramework的数据库,然后有由数据库初始化的数据库模型类,然后有视图模型,其中有每个html控件的字段,最后有带有特定ViewModel实例的控制器 我的问题是,视图模型在我的控制器(任何操作)请求下创建一次,另一次我总是检查它是否为null,如果为null,那么我使用我的数据库模型类从数据库中提取数据来重建视图模型,这是正确的做法,对吗?这样我就可以在性能上有所提高。。正确的?因为我正在重用视图模型,而不是每次都创建它 当后台

好的,我会尽量把事情简短明了

您可能知道,我有使用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时间优化的问题,我希望我的客户使用我的网站有一个新鲜、干净和快速的体验

谢谢大家!


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

默认情况下,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