2012-02-22 78 views
3

通过MVC + EF闯入并试图专注于以正确的方式做事。现在我正在寻找添加下拉到表单,但我想避免每次页面加载时击中数据库,所以我想将数据存储在应用程序级别。我想创建一个应用程序级变量不是最好的方法。我已经阅读过有关使用缓存和静态实用程序的功能,但令人惊讶的是,没有任何声音非常明确。 (静态类不好的单元测试,缓存坏在MVC中保持数据库存储的查找数据在应用程序级别的最佳实践

所以,我有两个场景,我很好奇,我不知道,如果方法将两种。

1之间的差异)的基本查询,让我们说五十个州。小,定义,永远不会改变。在应用程序启动时加载(不寻找一个硬编码的解决方案,但从数据库中检索)

2)一个查询,将很少改变,只有通过类似管理员的屏幕。比方说,您的产品正在出售的城市/商店。因此数据将被存储在模型中 ,但是除非有人通过应用程序进行更改,否则数据将相对静态。因此,每次我需要填充下拉列表框时,都不打算访问数据库。

好像基本的东西,但它基本上是相同的,因为这话题,从未回答:

Is it good to use a static EF object context in an MVC application for better perf?

任何帮助表示赞赏。

回答

2

我会在几个地方解决你的问题。首先,在MVC中使用静态变量或缓存模式本质上是不好的。答案根本不是。只要你的架构支持它们就没问题。只需将您的缓存放在正确的位置并进行可测试性设计,我将在稍后解释。

第二部分是什么是“正确”的方式来存储这种类型的持久数据,因此您不必循环访问数据库来填充常见的UI项目。为此,我不建议存储EF对象。我会创建您缓存的POCO对象(查看模型或类似)。因此,在您50个州的例子,你可能有这样的事情:

public class State 
{ 
    public string Abbreviation { get; set; } 

    public string Name { get; set; } 
} 

,那么你会做这样的事情来创建缓存列表:

List<State> states = Context.StateData.Select(s => new State { Abbreviation = s.Abbreviation, Name = s.Name}).ToList(); 

最后,无论你的缓存解决方案,它应该实现一个接口,以便您可以嘲笑该缓存方法进行测试。

要做到这一点,而不会在循环引用,或使用反射,则需要至少3个组件:

你的MVC应用程序 类库来定义你的POCO对象和接口 类库不执行数据访问和缓存(这显然可以分成2个库,如果这使得它更易于维护和/或测试)

这样,你可能有这样的事情在你的MVC代码:

ICache myCache = CacheFactory.CreateCache(); 
List<State> states = myCache.ListStates(); 
// populate your view model with states 

ICache和状态位于一个库中,而您的ICache的实际实现位于另一个库中。

这就是我为我的标准架构所做的:将数据访问不可知的POCO对象和接口分离为独立于数据访问的独立库,这与我的MVC应用程序是分开的。

+0

从技术上讲,您可以将您的POCO类作为您的数据访问层中缓存机制的接口。然后,你可以在你的MVC应用中实现缓存并实现接口并将它传递到数据访问层,如下所示:dataLayer.LoadStates(myCache)其中ICache将公开一个属性或方法,让你填充状态列表。 – 2012-02-23 02:23:06

0

使用诸如unity,ninject,structuremap等的依赖注入工具进行研究。这些将允许您通过实现一个内核来保持对象的应用程序级别控制,该内核与您的内容非常类似似乎在描述。

+0

我在我的项目中使用Ninject。但我不认为DI与应用程序级别的缓存数据有关。我错了吗? – 2012-02-23 14:00:57