在MVC中在应用程序级别保存数据库存储的查找数据的最佳实践

时间:2012-02-22 21:49:42

标签: asp.net-mvc-3 entity-framework-4.1

通过MVC + EF进行搜索,并尝试专注于以正确的方式做事。现在我想在表单中添加一个下拉列表,但是我想避免每次页面加载时都访问数据库,所以我想将数据存储在应用程序级别。我认为创建应用程序级变量不是最好的方法。我已经阅读了有关使用缓存和静态实用程序功能的内容,但令人惊讶的是,没有任何内容听起来非常明确。 (静态类不利于单元测试,缓存不好

所以我有两个我很好奇的场景,我不确定两者之间的方法是否会有所不同。

1)基本查找,比方说50个州。小的,定义的,永远不会改变。应用程序启动时加载。 (不是寻找硬编码的解决方案,而是从数据库中检索。)

2)很少改变的查找,只能通过类似管理员的屏幕。假设您销售产品的城市/商店。因此将存储数据 在模型中,除非有人通过应用程序进行更改,否则它将相对静止。因此,每次我需要填充下拉列表/列表框时,都不希望访问数据库。

看起来像基本的东西,但它与这个从未回答的主题基本相同:

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

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我将在几个部分向您提出问题。首先,在MVC中使用静态变量或缓存模式本质上是不好的。答案是否定的。只要您的架构支持它们就可以了。只需将缓存放在正确的位置并设计可测试性,我将在后面解释。

第二部分是存储此类持久数据的“正确”方法,因此您无需前往数据库进行往返以填充常见UI项目。为此,我不建议存储EF对象。我会创建您缓存的POCO对象(View模型或类似对象)。所以在你的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和State位于一个库中,而ICache的实际实现位于另一个库中。

这就是我为标准体系结构所做的事情:将与数据访问无关的POCO对象和接口分离到与我的MVC应用程序分开的数据访问的单独库中。

答案 1 :(得分:0)

使用依赖注入工具,例如unity,ninject,structuremap等。这些将允许您通过实现一个内核来查找您正在寻找的应用程序级别控件,该内核以与您看起来非常相似的方式保留对象要描述。