На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Как работать с кэшем в ASP.NET
    Если обращение к кешу происходит из aspx.cs(ascx.cs) файлов, то всё в порядке: у нас есть член Cache. Но что, если у меня обращение происходит в "бизнес-классе"?
    Например:
    ExpandedWrap disabled
      private class MyObject
      {
       public static MyObject GetObject(int iId)
       {
         MyObject objRes = Cashe.Get("MyObject"+iId.ToString()); // где взять Cache?
         if ( objRes==null )
         {
           ...
         }
         return objRes;
       }
      }
      public partial class page_test : System.Web.UI.UserControl
      {
          protected void Page_Load(object sender, EventArgs e)
          {
            MyObject obj=MyObject.GetObject(123);
          }
      }

    откуда взять Cache внутри MyObject?

    Добавлено
    Можно, конечно, передавать Cache параметром ... но имхо это изврат...
      Цитата Budda @
      но имхо это изврат...
      Изврат это сама идея, что безнес-объект чтото делает с кэшем.
      Но если архитектура все же это предусматривает, то да - передавать. Или может в My что найдется...
        Цитата ANDLL @
        Изврат это сама идея, что безнес-объект чтото делает с кэшем.

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

        Вобщем, какого-то глобального кэша приложения или чего-нить-такого, откуда можно было бы взять объект кэша, нет?
          Цитата Budda @
          Вобщем, какого-то глобального кэша приложения или чего-нить-такого, откуда можно было бы взять объект кэша, нет?

          Глобальнее кэша только объект Application, но до него тоже надо добраться.

          Цитата Budda @
          "архитектура" таки подразумевает, что на страничке я всегда работаю с готовым объектом, но перед "извлечением его из базы" я бы хотел посмотреть, есть ли он в кэше.

          так и проверяй наличие объекта в кэше на страничке
            Цитата kosten @
            так и проверяй наличие объекта в кэше на страничке

            Смотри, вот пара функций:
            ExpandedWrap disabled
              public abstract class ATeam
              {
                      public string GetRef(DbManager db)
                      {
                          return string.Format(@"<a href=""/manager_roster/TeamId_{0}/clg_pl.axpx"">{1} ({2}, {3})</a>"
                              , m_strId, m_strName, m_strTown, ACountry.GetCountryName(m_strCountryId, db)
                              );
                      }
                      public string GetName(DbManager db)
                      {
                          return string.Format(@"{0} ({1}, {2})"
                              , m_strName, m_strTown, ACountry.GetCountryName(m_strCountryId, db)
                              );
                      }
              }
              public abstract class ACountry
              {
                      public static string GetCountryName(string strCountryId, DbManager db)
                      {
                          return db
                              .SetCommand("SELECT Name FROM countries C WHERE Id=?Id", db.Parameter("?Id", strCountryId))
                              .ExecuteScalar<string>()
                              ;
                      }
              }

            Где по-твоему в данном случае стоит проверять, есть ли уже в кеше объект ACountry c определённым ИД?
            Имхо - в ACountry.GetCountryName
            Но в данном раскладе придётся туда передавать ещё и объект Cache, и ведь не только здесь... таких функций (будут) сотни!!!

            Цитата kosten @
            Глобальнее кэша только объект Application, но до него тоже надо добраться.

            Подскажи, плиз, как добраться? И есть ли в нём (я слышал, что вроде есть) Cache? Тем более, что объекты типа ACountry мне нужно кешировать как раз на уровне приложения, а не страницы.
              Budda
              а если попробовать в GetCountryName передавать HttpContext?
              Через него (HttpContext) можно получить доступ и к кешу, и к Application.
                попробовать то можно, скорее всего и получится.... но разве нет чего-то типа Application.GetApplication()?
                  Цитата kosten @
                  а если попробовать в GetCountryName передавать HttpContext?

                  сразу я не понял, что ты имел ввиду, но у HttpContext есть такая хрень (читай пропертис), как Current, а у него, в свою очередь, есть Cache - почти то, что мне и было нужно :)
                  ExpandedWrap disabled
                    Cache c = HttpContext.Current.Cache;

                  и я получаю достук к кэшу... вот только непонятно мне, к какому? В МСДНе сказано:
                  Цитата
                  Current - Gets the HttpContext object for the current HTTP request.

                  Но у меня
                  ExpandedWrap disabled
                            public static int GetIdByNick(string strNick)
                            {
                                int iUserId;
                                Cache c = HttpContext.Current.Cache;
                                //  Cache c = HttpContext.Current.Application.;
                                string strCN = string.Concat("GetIdByNick_", strNick);
                                object objInst = c.Get(strCN);
                                if( objInst != null )
                                {
                                    iUserId = (int)objInst;
                                    common.Log.WriteMessage("AUser.GetIdByNick, strNick (" + strNick + ") get from cache");
                                } else
                                {
                                    using( MyDbManager db = new MyDbManager() )
                                    {
                                        iUserId = db
                                            .SetCommand("SELECT Id FROM users WHERE Nick like ?Nick", db.Parameter("?Nick", strNick))
                                            .ExecuteScalar<int>()
                                            ;
                                        if( iUserId == null )
                                            iUserId = 0;
                                        c.Add(strCN, iUserId, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(2), CacheItemPriority.High, null);
                                        common.Log.WriteMessage("AUser.GetIdByNick, strNick (" + strNick + ") get from DB and put to cache");
                                    }
                                }
                                return iUserId;
                            }

                  данные в кеше сохраняются и доступны в течении этих моих двух минут также при запросах из другого браузера
                  Цитата

                  IE: 07.11.15 00:55:03: AUser.GetIdByNick, strNick (budda) get from DB and put to cache
                  FF: 07.11.15 00:55:18: AUser.GetIdByNick, strNick (budda2) get from DB and put to cache
                  FF: 07.11.15 00:55:21: AUser.GetIdByNick, strNick (budda) get from cache
                  IE: 07.11.15 00:55:47: AUser.GetIdByNick, strNick (budda2) get from cache

                  ...? что это за кэш?
                  HttpContext.Current.Cache
                    Цитата Budda @
                    что это за кэш?

                    это разве не то, что ты искал?
                      Цитата Budda @
                      Цитата kosten @
                      а если попробовать в GetCountryName передавать HttpContext?

                      сразу я не понял, что ты имел ввиду, но у HttpContext есть такая хрень (читай пропертис), как Current, а у него, в свою очередь, есть Cache - почти то, что мне и было нужно :)
                      ExpandedWrap disabled
                        Cache c = HttpContext.Current.Cache;

                      и я получаю достук к кэшу... вот только непонятно мне, к какому? В МСДНе сказано:
                      Цитата
                      Current - Gets the HttpContext object for the current HTTP request.

                      Но у меня
                      ExpandedWrap disabled
                                public static int GetIdByNick(string strNick)
                                {
                                    int iUserId;
                                    Cache c = HttpContext.Current.Cache;
                                    //  Cache c = HttpContext.Current.Application.;
                                    string strCN = string.Concat("GetIdByNick_", strNick);
                                    object objInst = c.Get(strCN);
                                    if( objInst != null )
                                    {
                                        iUserId = (int)objInst;
                                        common.Log.WriteMessage("AUser.GetIdByNick, strNick (" + strNick + ") get from cache");
                                    } else
                                    {
                                        using( MyDbManager db = new MyDbManager() )
                                        {
                                            iUserId = db
                                                .SetCommand("SELECT Id FROM users WHERE Nick like ?Nick", db.Parameter("?Nick", strNick))
                                                .ExecuteScalar<int>()
                                                ;
                                            if( iUserId == null )
                                                iUserId = 0;
                                            c.Add(strCN, iUserId, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(2), CacheItemPriority.High, null);
                                            common.Log.WriteMessage("AUser.GetIdByNick, strNick (" + strNick + ") get from DB and put to cache");
                                        }
                                    }
                                    return iUserId;
                                }

                      данные в кеше сохраняются и доступны в течении этих моих двух минут также при запросах из другого браузера
                      Цитата

                      IE: 07.11.15 00:55:03: AUser.GetIdByNick, strNick (budda) get from DB and put to cache
                      FF: 07.11.15 00:55:18: AUser.GetIdByNick, strNick (budda2) get from DB and put to cache
                      FF: 07.11.15 00:55:21: AUser.GetIdByNick, strNick (budda) get from cache
                      IE: 07.11.15 00:55:47: AUser.GetIdByNick, strNick (budda2) get from cache

                      ...? что это за кэш?
                      HttpContext.Current.Cache

                      Если ты создаёшь класс в асп приложении, то HttpContext.Current, даёт тебе доступ к текущему контексту ( запросу ).
                        Кто-то кого-от недопонимает: или вы меня, или я вас...


                        Цитата kosten @
                        это разве не то, что ты искал?

                        скажем так: я что-то нашёл, но не понимаю, что это такое.

                        Цитата Stereon @
                        Если ты создаёшь класс в асп приложении, то HttpContext.Current, даёт тебе доступ к текущему контексту ( запросу ).

                        Но что такое текущий запрос и как объяснить тот факт, что запросы из разных браузеров обращаются к однму контексту? Это что же - "текущий контекст" для всех один?
                          Ты неправильно понял, в HttpContext храниться Request по средствам которого ты получаешь данные о запросе.
                          Reponse - чтото поставить своё в ответ от твоего классса.
                          и глобальное хранилизще данных Cache.
                            Цитата Stereon @
                            и глобальное хранилизще данных Cache

                            Т.е. кэш - он один единственный на всё приложение и такого понятия как, ну например, кэш сессии, или кэш какого-то одного запроса не существует, да? :)

                            Спасибо.
                              Цитата Budda @
                              кэш - он один единственный на всё приложение

                              еще есть Application, но он менее гибкий чем Cache.
                                Цитата kosten @
                                еще есть Application

                                Application - что это?

                                HttpContext.Current.Cache - имеет тип System.Web.Caching.Cache, а Application (есть ещё и ApplicationInstance) - это нечто совсем другое...
                                и каким образом Application быть может менее гибким, чем Cache? Как их вообще можно сравнивать? Или ты хочешь сказать, что в Application также есть возможность что-то "закешировать" и затем извлечь из кэша? Тогда как?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0430 ]   [ 17 queries used ]   [ Generated: 24.04.24, 22:33 GMT ]