Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: ZeroBased_IXОтветов: 1

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

 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% случаев.

entity-framework

Ответы

Ответ 1 · рейтинг 2 · Tommy

Изменить

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

Один из способов, которым я работал с многопользовательским приложением, - создать функцию-оболочку, которая получает имя хранилища. По сути, сохраните имена в кеше 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"];

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы