使用DbContext和DI创建一个可以从剃刀调用的常用例程

时间:2018-05-03 14:35:27

标签: razor asp.net-core ef-core-2.0

我想创建一个公共例程,我可以传入一个键,在那个例程中,我拉出该键的值。如果密钥不存在,我将其从数据库中提取并缓存它。

在下面的示例中,Resources是一个包含静态成员ConfigDisplay的类。由于它是静态的,我没有注入我常用的依赖项(就像我可以使用Controller - httpcontext,services,repos等)。

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

<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 个答案:

答案 0 :(得分:1)

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

  1. Custom action filter

    您可以创建一个自定义操作过滤器,该过滤器将使用您的上下文注入,检索该值,然后将其设置为ViewBag之类的内容。然后,您只需要将属性添加到需要该值的任何控制器/操作,并且它将在那里等待您存储它的位置(即ViewBag)。这也可以在您的Startup.cs中全局应用。

  2. Tag helper

    您可以创建一个注入上下文的标记帮助器并检索该值。关于这种方法的好处在于,您可以对其进行一定程度的概括,以允许检索不同的值。例如,您可以使用标记帮助程序访问设置表并返回特定设置,如:

    <setting key="MySetting" />
    

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

  3. View component

    您可以创建一个视图组件,使用您的值呈现部分。如果值始终用于创建HTML的标准位,则这是一种很好的方法。您可以只调用视图组件,而不是在整个地方复制此HTML,它将获取值,然后呈现相应的HTML并将整个shebang转储到您的页面上。再次,您将它与您的上下文一起注入,以允许它检索值。

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

相关问题