使用 DbContext 和 DI 创建一个可从 razor 调用的通用例程

create a common routine callable from razor with DbContext and DI

我想创建一个通用例程,我可以在其中传递一个键,然后在该例程中提取该键的值。如果密钥不存在,我会从数据库中提取它并缓存它。

在下面的示例中,Resources 是具有静态成员 ConfigDisplay 的 class。因为它是静态的,所以我没有注入我通常的依赖项(就像我可以使用控制器 - httpcontext,服务,回购等)。

从需要访问我的 DbContext 的 Razor 调用方法的更好方法是什么?简而言之,我需要配置标签或按钮或其他任何内容的文本,并且在该页面的第一个请求期间,我将其从我的数据库中提取并缓存以供进一步请求。似乎是一个简单的问题,只是我的头脑没有正确地解决它!

<div>
    <input id="searchnode" type="text" placeholder="@Resources.ConfigDisplay("mykey")" />
</div> 


Inside my helper class, Resources:
 static public string ConfigDisplay(sting key)
    {  // Need DbContext here to pull out value for "key" if it doesn't exist }

您有几个选项,最佳选项取决于您需要此值的位置和频率:

  1. Custom action filter

    您可以创建一个自定义操作过滤器,它会注入您的上下文,检索值,然后将其设置为类似 ViewBag 的内容。然后,您只需将该属性添加到任何需要该值的 controller/action,它就会在您存储它的地方等着您(即 ViewBag)。这也可以在您的 Startup.cs.

  2. 中全局应用
  3. Tag helper

    您可以创建一个标签助手,它注入您的上下文并检索值。这种方法的好处在于,您可以对它进行某种程度的概括,以允许检索不同的值。例如,您可以有一个标签助手来访问设置 table 和 returns 特定设置,例如:

    <setting key="MySetting" />
    

    并且,一旦 Razor 完成视图渲染,它就会在那里设置该设置的值,而不是您的自定义标记。

  4. View component

    您可以创建一个视图组件,用您的值呈现局部。如果该值始终用于创建 HTML 的某些标准位,这是一个很好的方法。无需将此 HTML 复制到各处,您只需调用视图组件,它将获取值,然后呈现 HTML 的适当位并将整个 shebang 转储到您的页面上。同样,您可以将其与您的上下文一起注入,以允许它检索值。

在上述所有三种情况下,缓存位实际上是次要的,无论您采用哪种方法,都会以相同的方式处理。通常,您会在 Startup.cs 中配置一个 IDistributedCache,然后将 IDistributeCache 与您的上下文一起注入。您首先尝试从缓存中检索值,如果不存在,则查询上下文并将其保存到缓存中。