2011-10-26 53 views
0

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

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

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

回答

0

我想你可以将它们存储在内存中的缓存(分布式或本地取决于你有多少种语言和字典值)。

您可以使用languagecode | name键,值是该语言中的单词。

因此,您可以将我们| header_name作为关键字,并将“My Header”作为示例。

正如我上面提到的,这些值可以存储取决于您的要求。如果你认为它们不属于本地内存,你总是可以设置一个memcache结构或一个LRU缓存,该缓存包含最常用的N个最常用的值,如果有缓存未命中,它会转到数据库(包含所有语言的词典)来查找给定的名称和语言。

希望这有助于某种方式。

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'查询时,检查是否存在于缓存中。如果是,返回它,否则去数据库检索它。这是使用Repository Pattern的一大优势,缓存细节将从调用者中删除。如果您决定转到资源文件实施,那么无论如何这都不是必需的,因为这里建立了文化支持。