MVC6 Глобальное значение

Я пытаюсь получить имя веб-сайта для базы данных, вот модель:

 public class Store
 {
     public int Id { get; set; }
     public string StoreName { get; set; }
 }

Я пытаюсь сделать только один запрос к базе данных для этой информации.

Этот SiteName в настоящее время используется в панели навигации, но, вероятно, будет использоваться в других местах.

Я создал ViewComponent для панели навигации:

public class NavbarViewComponent : ViewComponent
    {
        private IStoreRepository _storeRepository;
        private string _storeName;
        public NavbarViewComponent(IStoreRepository storeRepository)
        {
            _storeRepository = storeRepository;
            _storeName = _storeRepository.GetStoreById(1).StoreName;
        }
        public IViewComponentResult Invoke()
        {
            return View((object)_storeName);
        }
    }

Доступ так:

@model string
<nav class="navbar navbar-default navbar-fixed-top">
    <div class="container-fluid">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" asp-controller="App" asp-action="Index">@Model</a> <!-- Here -->
...

Проблема в том, что каждый раз, когда загружается страница, делается запрос к базе данных, чтобы получить ее, что понятно. Однако я не уверен, как сделать так, чтобы SiteName был доступен одним вызовом в репозиторий и сохранен для будущего использования.

Я думал о загрузке его в переменную сеанса, но на самом деле он должен быть постоянным в 100% случаев.


person ZeroBased_IX    schedule 15.11.2015    source источник


Ответы (1)


Изменить

Приведенная ниже информация является хорошей идеей, если эта переменная используется в приложении. Однако в данном случае речь идет о динамическом имени магазина. Конечная часть здесь не сработает.

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

public string GetStoreNameById(int id){
   var httpContext = HttpContext.Current;
   //if no httpContext, just return from the db
   //rare but could throw a NullRefEx
   if(httpContext == null) return db.GetStore(id).Name;
   //build your key
   var key = string.format("Store-{0}", id);
   //if we get a cache miss, add the item from the db
   if(httpContext.Items[key] == null){
      var storeName = db.GetStore(id).Name;
      //note: there are overloads of this function for expiry times, etc.
      httpContext.Items.Add(key, storeName);
   }
   //return the value
   return httpContext.Items[key];
}

Подходит для нединамической переменной

Похоже, это должно быть параметром в файле web.config. Быстро получить значение и доступно из любой сборки, работающей в приложении.

<appSettings>
    <add key="StoreName" value="My Store"/>
</appSettings>

И чтобы получить это значение:

var storeName = ConfigurationManager.AppSettings["StoreName"];
person Tommy    schedule 15.11.2015
comment
Это хороший ответ, и сохранение его в конфигурации, вероятно, лучший способ, поэтому я отмечу это как правильный ответ. Возможно, мне даже не понадобится вызов БД для получения информации. Поскольку каждый Магазин развернут в своем контейнере на отдельных доменах. Я мог просто манипулировать config.json при развертывании. Спасибо Томми - person ZeroBased_IX; 15.11.2015
comment
@Jezzabeanz - я только что заметил, что вы используете .NET 5, можете ли вы внести исправления для любых различий между предыдущей версией 5 и версией 5? Это должно работать для версии 4.6 и ниже, но не уверен насчет синтаксиса 5. - person Tommy; 15.11.2015
comment
@Tommy: вы уверены, что контейнер «Элементы» — лучший выбор для настройки всего приложения? - person Wiktor Zychla; 15.11.2015
comment
Честно говоря, я еще не уверен, как программно манипулировать config.json (я пробовал V5 и MVC 6 всего несколько часов). - person ZeroBased_IX; 15.11.2015
comment
@WiktorZychla - как так? Я был бы рад развлечь лучшую мысль! - person Tommy; 15.11.2015