создать общую подпрограмму, вызываемую из бритвы с помощью DbContext и DI - PullRequest
0 голосов
/ 03 мая 2018

Я хочу создать общую процедуру, в которой я могу передать ключ, и в этой процедуре я извлекаю значение для этого ключа. Если ключа нет, я извлекаю его из БД и кеширую.

В приведенном ниже примере Resources - это класс со статическим членом, ConfigDisplay. Поскольку он статический, у меня нет привычных зависимостей (как у меня может быть с контроллером - httpcontext, services, repos и т. Д.).

Какой лучший способ вызвать метод из бритвы, которому нужен доступ к моему 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 голосов
/ 03 мая 2018

У вас есть несколько вариантов, лучший из которых зависит от того, где и как часто вам нужно это значение:

  1. Фильтр настраиваемого действия

    Вы можете создать фильтр настраиваемых действий, который будет добавлен в ваш контекст, извлечет значение и затем установит его в что-то вроде ViewBag. Затем вам нужно будет только добавить атрибут к любому контроллеру / действию, для которого требуется это значение, и он будет ждать вас там, где вы его сохранили (т.е. ViewBag). Это также может быть применено глобально в вашем Startup.cs.

  2. Помощник по тегам

    Вы можете создать помощника по тегам, который будет вставлен в ваш контекст и извлечет значение. Хорошая часть этого подхода заключается в том, что вы можете несколько обобщить его, чтобы можно было извлекать различные значения. Например, у вас может быть помощник по тегам, который обращается к таблице настроек и возвращает определенный параметр, например:

    <setting key="MySetting" />
    

    И, как только Razor закончит рендеринг вида, он будет иметь значение этого параметра вместо вашего пользовательского тега.

  3. Просмотр компонента

    Вы можете создать компонент представления, который отображает частичное с вашим значением. Это хороший подход, если значение всегда используется при создании некоторого стандартного фрагмента HTML. Вместо того, чтобы копировать этот HTML повсеместно, вы можете просто вызвать компонент представления, который извлечет значение, а затем отобразит соответствующий бит HTML и сбросит весь шебанг на вашей странице. Опять же, вы бы добавили его в свой контекст, чтобы позволить ему получить значение.

Во всех трех вышеупомянутых случаях бит кэширования действительно вторичен и будет обрабатываться одинаково независимо от того, какой подход вы выбрали. Как правило, вы должны настроить IDistributedCache в файле Startup.cs, а затем ввести IDistributeCache вместе с вашим контекстом. Сначала вы пытаетесь получить значение из кэша, а если его нет, то запрашиваете свой контекст и сохраняете его в своем кэше.

...