【发布时间】:2012-04-22 06:12:07
【问题描述】:
我在数据库中有两个值,它们定义了我的应用程序中太多事物的行为,至少在不久的将来不会改变。创建静态变量并在我的应用程序的Global.asax 中加载值是最佳决定吗?
【问题讨论】:
标签: c# asp.net asp.net-mvc-3 caching
我在数据库中有两个值,它们定义了我的应用程序中太多事物的行为,至少在不久的将来不会改变。创建静态变量并在我的应用程序的Global.asax 中加载值是最佳决定吗?
【问题讨论】:
标签: c# asp.net asp.net-mvc-3 caching
一般规则是,当您知道您的值/数据将过期或在特定时间段后需要更改时使用缓存,否则使用静态变量。我发现了一个类似的讨论HttpRuntime.Cache[] vs Application[]
另请查看ASP.NET Caching: Techniques and Best Practices
【讨论】:
是的,您可以将它们缓存在静态变量中。但是如果它们现在不需要更改并且保持不变,为什么不将它们定义为常量或在 web.config 中?
【讨论】:
我建议创建一个带有属性的静态类,这些常量设置将在您的应用程序启动时从数据库中设置其值。
每当我有存储在数据库中的“系统”设置时,我都会做同样的事情。我将它们作为属性保存在一个静态类中,并一直访问它们。我还对不经常更改但经常使用以减少数据库流量的小表(即项目组)的内容使用相同的技术。我创建只读集合并访问它们,而不是一直访问数据库。
但任何事情都是最适合您的问题,只要它干净且易于维护。
【讨论】:
我个人对我的 MVC 站点使用依赖注入(ninject 是我更喜欢的一种)。这允许您将变量定义为 .InSingletonScope,这意味着您不需要在应用程序中挂起令人讨厌的静态变量。然后,我在第一次请求时从数据库中加载值并将其存储在一个局部变量中,并且它非常整洁。
我会用这个:
public class CachedFooProperty : IFooProperty
{
public CachedFooProperty(IRepository<Foo> fooRepo)
{
Foo = fooRepo.GetFoo();
}
public Foo Foo{get;private set;}
}
然后像这样绑定它:
Bind<IFooProperty>().To<CachedFooProperty>().InSingletonScope();
这种做事方式的好处是,它真的很容易通过简单地更改绑定来打开和关闭缓存。您也可以非常轻松地将其更改为基于 web.config 的配置方法,而无需更改使用该设置的每个位置。
【讨论】: