将缓存对象暴露给视图的最佳方式

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")

希望这会有所帮助!

【讨论】:

以上是关于将缓存对象暴露给视图的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

Spring是如何解决循环依赖的?

为 memcached 和 Rails 组合片段和对象缓存的最佳方式

将对象从模板传递给 django 视图(控制器)

如何将我初始化的书架对象暴露给我的路由文件?

使用Webpack将jQuery暴露给真正的Window对象

Cython - 将 C++ 函数返回的 C++(向量和非向量)对象暴露给 Python