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));
}
? бага?
За тесты сел уже тогда, когда в моём проекте не выполнялось кеширование результатов для одного параметра, передаваемого в разные объекты...
Здравствуйте, _Budda_, Вы писали:
_B_>? бага? _B_>За тесты сел уже тогда, когда в моём проекте не выполнялось кеширование результатов для одного параметра, передаваемого в разные объекты... _B_>имхо бага... ?
Нет, не бага. Кеширование производится не на уровне экземпляра объекта, а глобально.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, _Budda_, Вы писали:
_B_>>? бага? _B_>>За тесты сел уже тогда, когда в моём проекте не выполнялось кеширование результатов для одного параметра, передаваемого в разные объекты... _B_>>имхо бага... ?
IT>Нет, не бага. Кеширование производится не на уровне экземпляра объекта, а глобально.
Как вариант, можно намутить статический метод, в который передавать this, да? А если пойти дальше, то ничто не мешает включить тот же this в список параметров, по которым выполняется кеширование, да?
Здравствуйте, _Budda_, Вы писали:
IT>>Нет, не бага. Кеширование производится не на уровне экземпляра объекта, а глобально. _B_>Как вариант, можно намутить статический метод, в который передавать this, да? А если пойти дальше, то ничто не мешает включить тот же this в список параметров, по которым выполняется кеширование, да?
Можно чего-нибудь придумать, просто пока в этом не было необходимости.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Andy77, Вы писали:
IT>>>Можно чего-нибудь придумать, просто пока в этом не было необходимости.
A>>Очень нужно
IT>А как лучше сделать? Как парамтр атрибута или новый атрибут? Назватьа его как-нибудь LocalCache или InstanceCache.
а зачем атрибут? привязываться к объекту...
Здравствуйте, _Budda_, Вы писали:
IT>>А как лучше сделать? Как парамтр атрибута или новый атрибут? Назватьа его как-нибудь LocalCache или InstanceCache. _B_>а зачем атрибут? привязываться к объекту...
Я бы тоже так предложил сделать, но ведь, наверное, куча существующего кода поломается. Хотя, на мой взгляд, такое поведение по умолчанию (и добавление GlobalCacheAttribute) было бы логичнее.
A>Я бы тоже так предложил сделать, но ведь, наверное, куча существующего кода поломается. Хотя, на мой взгляд, такое поведение по умолчанию (и добавление GlobalCacheAttribute) было бы логичнее.
Да... нехорошо может получиться. но имхо... надо. может устроишь на сайте БЛТулкита голосовалку... на месяц?
Здравствуйте, IT, Вы писали:
IT>А как лучше сделать? Как парамтр атрибута или новый атрибут? Назвать его как-нибудь LocalCache или InstanceCache.
как новый аттрибут... я так понимаю, что нужно будет билдер еще допиливать, т.к. кэш должен хранится в самом объекте к которому он относится, и притом не в статике... а то сборщик мусора его (объект) не соберет....
Здравствуйте, ili, Вы писали:
IT>>А как лучше сделать? Как парамтр атрибута или новый атрибут? Назвать его как-нибудь LocalCache или InstanceCache.
ili>как новый аттрибут... я так понимаю, что нужно будет билдер еще допиливать, т.к. кэш должен хранится в самом объекте к которому он относится, и притом не в статике... а то сборщик мусора его (объект) не соберет....
Придётся допиливать. Я уже аспекты для этого отрефакторил, осталось только сделать поддержку локальных аспектов и сам атрибут.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Придётся допиливать. Я уже аспекты для этого отрефакторил, осталось только сделать поддержку локальных аспектов и сам атрибут.
Как оно продвигается? Кстати, большое спасибо за усилия по созданию/улучшению документации!
IT>>Придётся допиливать. Я уже аспекты для этого отрефакторил, осталось только сделать поддержку локальных аспектов и сам атрибут.
A>Как оно продвигается? Кстати, большое спасибо за усилия по созданию/улучшению документации!
Извините за поднятие старого топика, но есть ли какие-то новости на этом фронте? У меня вся система client-side валидации построена на асинхронных вызовах методов кешированных data accessors, осталось решить эту проблему с кешированием и всё заработает...
Здравствуйте, Andy77, Вы писали:
A>Извините за поднятие старого топика, но есть ли какие-то новости на этом фронте? У меня вся система client-side валидации построена на асинхронных вызовах методов кешированных data accessors, осталось решить эту проблему с кешированием и всё заработает...
Да, действительно, как-то оно затянулось. Извини.
Done. Можешь забирать.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.