Mercurial > pub > bltoolkit
diff HowTo/Aspects/CacheAspect.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HowTo/Aspects/CacheAspect.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,87 @@ +using System; +using System.Reflection; + +using NUnit.Framework; + +using BLToolkit.Aspects; +using BLToolkit.Reflection; + +namespace HowTo.Aspects +{ + public /*[a]*/abstract/*[/a]*/ class TestClass + { + public static int Value; + + // 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. + // + [/*[a]*/Cache/*[/a]*/(MaxCacheTime=500, IsWeak=false)] + public /*[a]*/virtual/*[/a]*/ int CachedMethod(int p1, int p2) + { + return Value; + } + + public static TestClass CreateInstance() + { + // Use TypeAccessor to create an instance of an abstract class. + // + return /*[a]*/TypeAccessor/*[/a]*/<TestClass>.CreateInstance(); + } + } + + [TestFixture] + public class CacheAspectTest + { + [Test] + public void Test1() + { + TestClass tc = TestClass.CreateInstance(); + + DateTime begin = DateTime.Now; + + // Initial setup for the test static variable. + // + TestClass.Value = 777; + + while (tc.CachedMethod(2, 2) == 777) + { + // This change will not affect the Test method return value for 500 ms. + // + TestClass.Value++; + } + + double totalMilliseconds = (DateTime.Now - begin).TotalMilliseconds; + + Assert.GreaterOrEqual(totalMilliseconds, 500); + } + + [Test] + public void Test2() + { + TestClass tc = TestClass.CreateInstance(); + + // Return value depends on parameter values. + // + TestClass.Value = /*[a]*/1/*[/a]*/; Assert.AreEqual(/*[a]*/1/*[/a]*/, tc.CachedMethod(1, 1)); + TestClass.Value = /*[a]*/2/*[/a]*/; Assert.AreEqual(/*[a]*/1/*[/a]*/, tc.CachedMethod(1, 1)); // no change + TestClass.Value = /*[a]*/3/*[/a]*/; Assert.AreEqual(/*[a]*/3/*[/a]*/, tc.CachedMethod(2, 1)); + + // However we can clear cache manually. + // For particular method: + // + CacheAspect.ClearCache(typeof(TestClass), "CachedMethod", typeof(int), typeof(int)); + TestClass.Value = /*[a]*/4/*[/a]*/; Assert.AreEqual(/*[a]*/4/*[/a]*/, tc.CachedMethod(2, 1)); + + // By MethodInfo: + // + MethodInfo methodInfo = tc.GetType().GetMethod("CachedMethod", new Type[] { typeof(int), typeof(int) }); + CacheAspect.ClearCache(methodInfo); + TestClass.Value = /*[a]*/5/*[/a]*/; Assert.AreEqual(/*[a]*/5/*[/a]*/, tc.CachedMethod(2, 1)); + + // For the all cached methods. + // + CacheAspect.ClearCache(); + TestClass.Value = /*[a]*/6/*[/a]*/; Assert.AreEqual(/*[a]*/6/*[/a]*/, tc.CachedMethod(2, 1)); + } + } +}