基于缓存的MVC 3全球化

时间:2011-10-26 09:12:21

标签: asp.net-mvc-3 caching globalization

我有一个MVC 3应用程序,其中包含SQL数据库中的所有文本。文本包含每种语言的名称和值。我想将文本存储在缓存对象中,并根据某些会话变量以某种方式将它们放入我的视图和控制器中。

我的第一个解决方案是将对象TextHandler存储在Cache中。 TextHandler具有帮助按名称(作为字符串)和其他值提取文本的所有文本和方法。我还有一些控制器方法和帮助器,可以根据会话变量从TextHandler获取文本。我不满意这个解决方案。

我已经找到了一些指南,但我真正需要的是关于如何做到而不是实际代码的一些指示。

3 个答案:

答案 0 :(得分:0)

我猜您可以将它们存储在内存缓存中(分布式或本地缓存,具体取决于您拥有的语言和字典值)。

您可以使用语言代码|名称键,值是该语言中的单词。

所以你可以把我们| header_name作为关键字,将“My Header”作为值。例如。

正如我上面提到的,可以存储这些值取决于您的要求。如果您认为它们不属于本地内存,您可以始终设置memcache结构或LRU缓存,其中包含大量使用的前N个最常用值,如果有缓存未命中,则会转到数据库(包含所有语言的字典)以找到给定的值,然后是名称和语言。

希望这会有所帮助。

答案 1 :(得分:0)

一种常见的方法是在URL上提供代码并用作控制器中的参数。除了您在数据库中查询的任何字符串之外,还会使用此语言代码。

如果您考虑资源文件,已经为您设置了解决方案: http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx

另一件事是基于浏览器请求设置文化的内容。使用此名称查询数据库。文化名称(来自How to pass CultureInfo to partialView for ajax call?

public static string GetCurrentCulture()
{
   return Thread.CurrentThread.CurrentCulture.Name;
}

现在要特定于缓存,只需实现存储库模式。当您通过'language'和'string'进行查询时,请检查缓存中是否存在。如果是,则返回它,否则转到数据库检索它。这是使用存储库模式的一大优势,缓存细节将从调用者中删除。如果您决定转到资源文件实现,那么无论如何都不需要这样做,因为有内置的文化支持。

答案 2 :(得分:0)

我最终得到了一个自定义资源提供程序,例如http://weblogs.asp.net/thangchung/archive/2010/06/25/extending-resource-provider-for-soring-resources-in-the-database.aspx,但稍作修改。