Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.9.115] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Если обращение к кешу происходит из aspx.cs(ascx.cs) файлов, то всё в порядке: у нас есть член Cache. Но что, если у меня обращение происходит в "бизнес-классе"?
Например: 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 параметром ... но имхо это изврат... |
Сообщ.
#2
,
|
|
|
Цитата Budda @ Изврат это сама идея, что безнес-объект чтото делает с кэшем.но имхо это изврат... Но если архитектура все же это предусматривает, то да - передавать. Или может в My что найдется... |
Сообщ.
#3
,
|
|
|
Цитата ANDLL @ Изврат это сама идея, что безнес-объект чтото делает с кэшем. Возможно я неточно выразился: надо мне до конца прояснить, что люди подразумевают под бизнес объектом, но "архитектура" таки подразумевает, что на страничке я всегда работаю с готовым объектом, но перед "извлечением его из базы" я бы хотел посмотреть, есть ли он в кэше. Вобщем, какого-то глобального кэша приложения или чего-нить-такого, откуда можно было бы взять объект кэша, нет? |
Сообщ.
#4
,
|
|
|
Цитата Budda @ Вобщем, какого-то глобального кэша приложения или чего-нить-такого, откуда можно было бы взять объект кэша, нет? Глобальнее кэша только объект Application, но до него тоже надо добраться. Цитата Budda @ "архитектура" таки подразумевает, что на страничке я всегда работаю с готовым объектом, но перед "извлечением его из базы" я бы хотел посмотреть, есть ли он в кэше. так и проверяй наличие объекта в кэше на страничке |
Сообщ.
#5
,
|
|
|
Цитата kosten @ так и проверяй наличие объекта в кэше на страничке Смотри, вот пара функций: 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 мне нужно кешировать как раз на уровне приложения, а не страницы. |
Сообщ.
#6
,
|
|
|
Budda
а если попробовать в GetCountryName передавать HttpContext? Через него (HttpContext) можно получить доступ и к кешу, и к Application. |
Сообщ.
#7
,
|
|
|
попробовать то можно, скорее всего и получится.... но разве нет чего-то типа Application.GetApplication()?
|
Сообщ.
#8
,
|
|
|
Цитата kosten @ а если попробовать в GetCountryName передавать HttpContext? сразу я не понял, что ты имел ввиду, но у HttpContext есть такая хрень (читай пропертис), как Current, а у него, в свою очередь, есть Cache - почти то, что мне и было нужно Cache c = HttpContext.Current.Cache; и я получаю достук к кэшу... вот только непонятно мне, к какому? В МСДНе сказано: Цитата Current - Gets the HttpContext object for the current HTTP request. Но у меня 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 |
Сообщ.
#9
,
|
|
|
Цитата Budda @ что это за кэш? это разве не то, что ты искал? |
Сообщ.
#10
,
|
|
|
Цитата Budda @ Цитата kosten @ а если попробовать в GetCountryName передавать HttpContext? сразу я не понял, что ты имел ввиду, но у HttpContext есть такая хрень (читай пропертис), как Current, а у него, в свою очередь, есть Cache - почти то, что мне и было нужно Cache c = HttpContext.Current.Cache; и я получаю достук к кэшу... вот только непонятно мне, к какому? В МСДНе сказано: Цитата Current - Gets the HttpContext object for the current HTTP request. Но у меня 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, даёт тебе доступ к текущему контексту ( запросу ). |
Сообщ.
#11
,
|
|
|
Кто-то кого-от недопонимает: или вы меня, или я вас...
Цитата kosten @ это разве не то, что ты искал? скажем так: я что-то нашёл, но не понимаю, что это такое. Цитата Stereon @ Если ты создаёшь класс в асп приложении, то HttpContext.Current, даёт тебе доступ к текущему контексту ( запросу ). Но что такое текущий запрос и как объяснить тот факт, что запросы из разных браузеров обращаются к однму контексту? Это что же - "текущий контекст" для всех один? |
Сообщ.
#12
,
|
|
|
Ты неправильно понял, в HttpContext храниться Request по средствам которого ты получаешь данные о запросе.
Reponse - чтото поставить своё в ответ от твоего классса. и глобальное хранилизще данных Cache. |
Сообщ.
#13
,
|
|
|
Цитата Stereon @ и глобальное хранилизще данных Cache Т.е. кэш - он один единственный на всё приложение и такого понятия как, ну например, кэш сессии, или кэш какого-то одного запроса не существует, да? Спасибо. |
Сообщ.
#14
,
|
|
|
Цитата Budda @ кэш - он один единственный на всё приложение еще есть Application, но он менее гибкий чем Cache. |
Сообщ.
#15
,
|
|
|
Цитата kosten @ еще есть Application Application - что это? HttpContext.Current.Cache - имеет тип System.Web.Caching.Cache, а Application (есть ещё и ApplicationInstance) - это нечто совсем другое... и каким образом Application быть может менее гибким, чем Cache? Как их вообще можно сравнивать? Или ты хочешь сказать, что в Application также есть возможность что-то "закешировать" и затем извлечь из кэша? Тогда как? |