annotate HowTo/Aspects/CacheAspect.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using NUnit.Framework;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using BLToolkit.Aspects;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 namespace HowTo.Aspects
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 public /*[a]*/abstract/*[/a]*/ class TestClass
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 public static int Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 // This is a method we will cache. Cached return value depends on input parameters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 // We will change the 'Value' field outside of the class and see how it affects the result.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 [/*[a]*/Cache/*[/a]*/(MaxCacheTime=500, IsWeak=false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 public /*[a]*/virtual/*[/a]*/ int CachedMethod(int p1, int p2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 return Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public static TestClass CreateInstance()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 // Use TypeAccessor to create an instance of an abstract class.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 return /*[a]*/TypeAccessor/*[/a]*/<TestClass>.CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 [TestFixture]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 public class CacheAspectTest
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 public void Test1()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 TestClass tc = TestClass.CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 DateTime begin = DateTime.Now;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 // Initial setup for the test static variable.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 TestClass.Value = 777;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 while (tc.CachedMethod(2, 2) == 777)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 // This change will not affect the Test method return value for 500 ms.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 TestClass.Value++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 double totalMilliseconds = (DateTime.Now - begin).TotalMilliseconds;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 Assert.GreaterOrEqual(totalMilliseconds, 500);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 public void Test2()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 TestClass tc = TestClass.CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 // Return value depends on parameter values.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 TestClass.Value = /*[a]*/1/*[/a]*/; Assert.AreEqual(/*[a]*/1/*[/a]*/, tc.CachedMethod(1, 1));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 TestClass.Value = /*[a]*/2/*[/a]*/; Assert.AreEqual(/*[a]*/1/*[/a]*/, tc.CachedMethod(1, 1)); // no change
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 TestClass.Value = /*[a]*/3/*[/a]*/; Assert.AreEqual(/*[a]*/3/*[/a]*/, tc.CachedMethod(2, 1));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 // However we can clear cache manually.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 // For particular method:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 CacheAspect.ClearCache(typeof(TestClass), "CachedMethod", typeof(int), typeof(int));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 TestClass.Value = /*[a]*/4/*[/a]*/; Assert.AreEqual(/*[a]*/4/*[/a]*/, tc.CachedMethod(2, 1));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 // By MethodInfo:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 MethodInfo methodInfo = tc.GetType().GetMethod("CachedMethod", new Type[] { typeof(int), typeof(int) });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 CacheAspect.ClearCache(methodInfo);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 TestClass.Value = /*[a]*/5/*[/a]*/; Assert.AreEqual(/*[a]*/5/*[/a]*/, tc.CachedMethod(2, 1));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 // For the all cached methods.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 CacheAspect.ClearCache();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 TestClass.Value = /*[a]*/6/*[/a]*/; Assert.AreEqual(/*[a]*/6/*[/a]*/, tc.CachedMethod(2, 1));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 }