将缓存对象暴露给视图的最佳方式
Posted
技术标签:
【中文标题】将缓存对象暴露给视图的最佳方式【英文标题】:Best way to expose cached objects to the views 【发布时间】:2012-06-08 08:59:27 【问题描述】:我正在使用 Translator 对象(自定义类)来公开网站文本(该对象存储数据库中的文本)。 Translator 对象存储在缓存中,在 Application_Start() 函数中。
我目前对 Translator 对象的使用是:
我有一个 MasterViewModel
public class MasterViewModel
public Translator Translator = HttpContext.Current.Cache.Get("Translator") as Translator;
每个视图都有一个视图模型,它来自 MasterViewModel
public class RandomViewModel : MasterViewModel
在我看来,我可以使用我的 Translator 对象
@model ViewModels.RandomViewModel
@Model.Translator.GetText(label)
我不认为这是一个很好的方法。 在 App_Code 中做一个剃须刀助手是个好主意,以便在我看来我可以使用
@Translate.GetText("RANDOM_TEXT")
这将是 Helper 函数(在 Translate.cshtml 中)
@helper GetText(string label)
Translator Translator = @Cache.Get("Translator") as Translator;
@: Translator.GetTextByLabel(label);
所以我的问题是将缓存对象暴露给我的所有视图的最佳方式是什么。 上述方法之一好吗?还是我应该选择其他解决方案?
(我希望我的英语没问题,我是荷兰人)
【问题讨论】:
【参考方案1】:您可以通过不同的方式来实现这一点,但我将通过从 WebViewPage
派生来创建一个基类,并强制所有剃须刀视图都从该类继承。
public abstract class MyWebViewPageBase<T>: WebViewPage<T>
private Translator _translator;
protected override void InitializePage()
_translator = Context.Cache.Get("Translator") as Translator;
public string Translate(string label)
if(_translator != null)
return _translator.GetText(label);
return "";
现在我可以通过以下几种方式在剃刀视图中继承MyWebViewPage
:
第一种方法是从每个视图中您必须使用@inherits
指令。
例如
// Index.cshtml
@inherits MyWebViewPageBase
@model ...
....
另一种方法是为所有视图设置基本页面的全局方法,为此您必须修改存在于 Views
文件夹中的 web.config。
你必须如下设置pages
元素的pageBaseType
,
<pages pageBaseType="MyWebViewPageBase">
现在从任何角度来看,您都可以简单地调用 translate 方法,如下所示,
@Translate("RANDOM_TEXT")
希望这会有所帮助!
【讨论】:
以上是关于将缓存对象暴露给视图的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
为 memcached 和 Rails 组合片段和对象缓存的最佳方式