CacheAspect для разных объектов
От: _Budda_ Украина http://vfm.1gb.ru
Дата: 27.05.08 16:58
Оценка:
Для теста использовал пример на основе оригинала: http://bltoolkit.net/doc/Aspects/CacheAspect.htm
    public abstract class TestClass
    {
        public static int Value;

        public int P1;
        // This is a method we will cache. Cached return value depends on input parameters.
        // We will change the 'Value' field outside of the class and see how it affects the result.
        //
        [Cache(MaxCacheTime = 500, IsWeak = false)]
        public virtual int CachedMethod(int p1, int p2)
        {
            return Value+p1+p2;
        }

        [Cache(MaxCacheTime = 500, IsWeak = false)]
        public virtual int CachedMethod(int p2)
        {
            return Value + P1 + p2;
        }

        public static TestClass CreateInstance()
        {
            // Use TypeAccessor to create an instance of an abstract class.
            //
            return TypeAccessor<TestClass>.CreateInstance();
        }
    }


А вот юнит-тест этого класса:

        public void TestMethod2()
        {
            TestClass tc = TestClass.CreateInstance();

            // Return value depends on parameter values.
            //
            TestClass.Value = 1; Assert.AreEqual(1+1+1, tc.CachedMethod(1, 1));
            TestClass.Value = 2; Assert.AreEqual(1+1+1, tc.CachedMethod(1, 1)); // no change
            TestClass.Value = 3; Assert.AreEqual(3+2+1, tc.CachedMethod(2, 1));

            // However we can clear cache manually.
            // For particular method:
            //
            CacheAspect.ClearCache(typeof(TestClass), "CachedMethod", typeof(int), typeof(int));
            TestClass.Value = 4; Assert.AreEqual(4+2+1, tc.CachedMethod(2, 1));

            // By MethodInfo:
            //
            MethodInfo methodInfo = tc.GetType().GetMethod("CachedMethod", new Type[] { typeof(int), typeof(int) });
            CacheAspect.ClearCache(methodInfo);
            TestClass.Value = 5; Assert.AreEqual(5+2+1, tc.CachedMethod(2, 1));

            // For the all cached methods.
            //
            CacheAspect.ClearCache();
            TestClass.Value = 6; Assert.AreEqual(6+2+1, tc.CachedMethod(2, 1));

// выполнились тесты, приведённые в примере - пока всё ок.

            TestClass tc1 = TestClass.CreateInstance();
            tc1.P1 = 111;
            TestClass.Value = 5; Assert.AreEqual(5 + 111 + 1, tc1.CachedMethod(1));
            TestClass.Value = 6; Assert.AreEqual(5 + 111 + 1, tc1.CachedMethod(1));
            TestClass.Value = 7; Assert.AreEqual(7 + 111 + 2, tc1.CachedMethod(2));
// тесты для 1го инстанса объекта прошли 

            TestClass tc2 = TestClass.CreateInstance();
            tc2.P1 = 222;
            TestClass.Value = 5; Assert.AreEqual(5 + 222 + 1, tc2.CachedMethod(1)); // Expected:<228>. Actual:<117>.     
            TestClass.Value = 6; Assert.AreEqual(5 + 222 + 1, tc2.CachedMethod(1));
            TestClass.Value = 7; Assert.AreEqual(7 + 222 + 2, tc2.CachedMethod(2));


        }

? бага?

За тесты сел уже тогда, когда в моём проекте не выполнялось кеширование результатов для одного параметра, передаваемого в разные объекты...

имхо бага... ?
Re: CacheAspect для разных объектов
От: IT Россия linq2db.com
Дата: 27.05.08 17:12
Оценка:
Здравствуйте, _Budda_, Вы писали:

_B_>? бага?

_B_>За тесты сел уже тогда, когда в моём проекте не выполнялось кеширование результатов для одного параметра, передаваемого в разные объекты...
_B_>имхо бага... ?

Нет, не бага. Кеширование производится не на уровне экземпляра объекта, а глобально.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: CacheAspect для разных объектов
От: _Budda_ Украина http://vfm.1gb.ru
Дата: 27.05.08 18:21
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, _Budda_, Вы писали:


_B_>>? бага?

_B_>>За тесты сел уже тогда, когда в моём проекте не выполнялось кеширование результатов для одного параметра, передаваемого в разные объекты...
_B_>>имхо бага... ?

IT>Нет, не бага. Кеширование производится не на уровне экземпляра объекта, а глобально.

Как вариант, можно намутить статический метод, в который передавать this, да? А если пойти дальше, то ничто не мешает включить тот же this в список параметров, по которым выполняется кеширование, да?
Re[3]: CacheAspect для разных объектов
От: IT Россия linq2db.com
Дата: 27.05.08 18:33
Оценка:
Здравствуйте, _Budda_, Вы писали:

IT>>Нет, не бага. Кеширование производится не на уровне экземпляра объекта, а глобально.

_B_>Как вариант, можно намутить статический метод, в который передавать this, да? А если пойти дальше, то ничто не мешает включить тот же this в список параметров, по которым выполняется кеширование, да?

Можно чего-нибудь придумать, просто пока в этом не было необходимости.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: CacheAspect для разных объектов
От: Andy77 Ниоткуда  
Дата: 27.05.08 19:28
Оценка:
Здравствуйте, IT, Вы писали:

IT>Можно чего-нибудь придумать, просто пока в этом не было необходимости.


Очень нужно
Re[5]: CacheAspect для разных объектов
От: IT Россия linq2db.com
Дата: 27.05.08 20:47
Оценка:
Здравствуйте, Andy77, Вы писали:

IT>>Можно чего-нибудь придумать, просто пока в этом не было необходимости.


A>Очень нужно


А как лучше сделать? Как парамтр атрибута или новый атрибут? Назвать его как-нибудь LocalCache или InstanceCache.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: CacheAspect для разных объектов
От: _Budda_ Украина http://vfm.1gb.ru
Дата: 27.05.08 22:35
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Andy77, Вы писали:


IT>>>Можно чего-нибудь придумать, просто пока в этом не было необходимости.


A>>Очень нужно


IT>А как лучше сделать? Как парамтр атрибута или новый атрибут? Назватьа его как-нибудь LocalCache или InstanceCache.

а зачем атрибут? привязываться к объекту...
Re[7]: CacheAspect для разных объектов
От: Andy77 Ниоткуда  
Дата: 27.05.08 23:02
Оценка:
Здравствуйте, _Budda_, Вы писали:

IT>>А как лучше сделать? Как парамтр атрибута или новый атрибут? Назватьа его как-нибудь LocalCache или InstanceCache.

_B_>а зачем атрибут? привязываться к объекту...

Я бы тоже так предложил сделать, но ведь, наверное, куча существующего кода поломается. Хотя, на мой взгляд, такое поведение по умолчанию (и добавление GlobalCacheAttribute) было бы логичнее.
Re[8]: CacheAspect для разных объектов
От: _Budda_ Украина http://vfm.1gb.ru
Дата: 28.05.08 00:00
Оценка:
A>Я бы тоже так предложил сделать, но ведь, наверное, куча существующего кода поломается. Хотя, на мой взгляд, такое поведение по умолчанию (и добавление GlobalCacheAttribute) было бы логичнее.

Да... нехорошо может получиться. но имхо... надо. может устроишь на сайте БЛТулкита голосовалку... на месяц?
Re[6]: CacheAspect для разных объектов
От: ili Россия  
Дата: 31.05.08 18:00
Оценка:
Здравствуйте, IT, Вы писали:

IT>А как лучше сделать? Как парамтр атрибута или новый атрибут? Назвать его как-нибудь LocalCache или InstanceCache.


как новый аттрибут... я так понимаю, что нужно будет билдер еще допиливать, т.к. кэш должен хранится в самом объекте к которому он относится, и притом не в статике... а то сборщик мусора его (объект) не соберет....
Re[7]: CacheAspect для разных объектов
От: IT Россия linq2db.com
Дата: 31.05.08 18:12
Оценка:
Здравствуйте, ili, Вы писали:

IT>>А как лучше сделать? Как парамтр атрибута или новый атрибут? Назвать его как-нибудь LocalCache или InstanceCache.


ili>как новый аттрибут... я так понимаю, что нужно будет билдер еще допиливать, т.к. кэш должен хранится в самом объекте к которому он относится, и притом не в статике... а то сборщик мусора его (объект) не соберет....


Придётся допиливать. Я уже аспекты для этого отрефакторил, осталось только сделать поддержку локальных аспектов и сам атрибут.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: CacheAspect для разных объектов
От: Andy77 Ниоткуда  
Дата: 19.06.08 15:38
Оценка:
Здравствуйте, IT, Вы писали:

IT>Придётся допиливать. Я уже аспекты для этого отрефакторил, осталось только сделать поддержку локальных аспектов и сам атрибут.


Как оно продвигается? Кстати, большое спасибо за усилия по созданию/улучшению документации!
Re[9]: CacheAspect для разных объектов
От: Andy77 Ниоткуда  
Дата: 15.07.08 18:44
Оценка:
IT>>Придётся допиливать. Я уже аспекты для этого отрефакторил, осталось только сделать поддержку локальных аспектов и сам атрибут.

A>Как оно продвигается? Кстати, большое спасибо за усилия по созданию/улучшению документации!


Извините за поднятие старого топика, но есть ли какие-то новости на этом фронте? У меня вся система client-side валидации построена на асинхронных вызовах методов кешированных data accessors, осталось решить эту проблему с кешированием и всё заработает...
Re[10]: CacheAspect для разных объектов
От: IT Россия linq2db.com
Дата: 16.07.08 00:32
Оценка: 9 (1)
Здравствуйте, Andy77, Вы писали:

A>Извините за поднятие старого топика, но есть ли какие-то новости на этом фронте? У меня вся система client-side валидации построена на асинхронных вызовах методов кешированных data accessors, осталось решить эту проблему с кешированием и всё заработает...


Да, действительно, как-то оно затянулось. Извини.

Done. Можешь забирать.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: CacheAspect для разных объектов
От: Denis K.  
Дата: 28.07.08 07:49
Оценка: 12 (1)
'InstanceCacheAttribute.cs' не добавлен в BLToolkit.2.csproj
... << RSDN@Home 1.2.0 alpha 4 rev. 1099>>
Done
От: Блудов Павел Россия  
Дата: 28.07.08 10:12
Оценка:
Здравствуйте, Denis K., Вы писали:

DK>'InstanceCacheAttribute.cs' не добавлен в BLToolkit.2.csproj

Спасибо.
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.