Skip to content

Commit 3695286

Browse files
fl3ppFlepp Jann
authored andcommitted
Use .NET Memory Caching
Signed-off-by: Jann Flepp <[email protected]>
1 parent 929d0cb commit 3695286

File tree

6 files changed

+24
-76
lines changed

6 files changed

+24
-76
lines changed

ArchUnitNET/ArchUnitNET.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<PackageReference Include="Mono.Cecil" Version="0.11.6" />
2323
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
2424
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
25+
<PackageReference Include="System.Runtime.Caching" Version="4.5.0" />
2526
</ItemGroup>
2627
<ItemGroup>
2728
<None Include="../README.md" Pack="true" PackagePath="" />
Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,23 @@
1-
using System.Collections.Concurrent;
1+
using System.Runtime.Caching;
22

33
namespace ArchUnitNET.Domain
44
{
55
public class ArchitectureCache
66
{
7-
protected readonly ConcurrentDictionary<ArchitectureCacheKey, Architecture> Cache =
8-
new ConcurrentDictionary<ArchitectureCacheKey, Architecture>();
7+
protected readonly MemoryCache _cache = new MemoryCache(nameof(ArchitectureCache));
98

109
protected ArchitectureCache() { }
1110

1211
public static ArchitectureCache Instance { get; } = new ArchitectureCache();
1312

1413
public Architecture TryGetArchitecture(ArchitectureCacheKey architectureCacheKey)
1514
{
16-
return Cache.TryGetValue(architectureCacheKey, out var matchArchitecture)
17-
? matchArchitecture
18-
: null;
15+
return _cache.Get(architectureCacheKey.ToString()) as Architecture;
1916
}
2017

21-
public bool Add(ArchitectureCacheKey architectureCacheKey, Architecture architecture)
18+
public void Add(ArchitectureCacheKey architectureCacheKey, Architecture architecture)
2219
{
23-
return Cache.TryAdd(architectureCacheKey, architecture);
20+
_cache.Add(architectureCacheKey.ToString(), architecture, new CacheItemPolicy());
2421
}
25-
26-
public void Clear() => Cache.Clear();
2722
}
2823
}

ArchUnitNET/Domain/ArchitectureCacheKey.cs

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,48 +5,19 @@
55

66
namespace ArchUnitNET.Domain
77
{
8-
public class ArchitectureCacheKey : IEquatable<ArchitectureCacheKey>
8+
public class ArchitectureCacheKey
99
{
1010
private readonly SortedSet<(string moduleName, string filter)> _architectureCacheKey =
1111
new SortedSet<(string moduleName, string filter)>(new ArchitectureCacheKeyComparer());
1212

13-
public bool Equals(ArchitectureCacheKey other)
14-
{
15-
return other != null
16-
&& _architectureCacheKey.SequenceEqual(other._architectureCacheKey);
17-
}
18-
1913
public void Add(string moduleName, string filter)
2014
{
2115
_architectureCacheKey.Add((moduleName, filter));
2216
}
2317

24-
public override bool Equals(object obj)
25-
{
26-
if (ReferenceEquals(null, obj))
27-
{
28-
return false;
29-
}
30-
31-
if (ReferenceEquals(this, obj))
32-
{
33-
return true;
34-
}
35-
36-
return obj.GetType() == GetType() && Equals((ArchitectureCacheKey)obj);
37-
}
38-
39-
public override int GetHashCode()
18+
public override string ToString()
4019
{
41-
unchecked
42-
{
43-
var hashCode = 397;
44-
_architectureCacheKey.ForEach(tuple =>
45-
{
46-
hashCode = (hashCode * 131) ^ tuple.GetHashCode();
47-
});
48-
return hashCode;
49-
}
20+
return string.Join(",", _architectureCacheKey);
5021
}
5122
}
5223

ArchUnitNETTests/Domain/ArchitectureCacheKeyTests.cs

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,10 @@ public ArchitectureCacheKeyTests()
3535
private readonly ArchitectureCacheKey _duplicateArchitectureCacheKey;
3636

3737
[Fact]
38-
public void ArchitectureCacheKeyContentEquivalentsAreEqual()
38+
public void ArchitectureCacheKeyContentEquivalentsAreStringEqual()
3939
{
4040
object contentEquivalent = new ArchitectureCacheKey();
41-
Assert.True(_architectureCacheKey.Equals(contentEquivalent));
42-
}
43-
44-
[Fact]
45-
public void ArchitectureCacheKeyDoesNotEqualNull()
46-
{
47-
Assert.False(_architectureCacheKey.Equals((object)null));
48-
}
49-
50-
[Fact]
51-
public void ArchitectureCacheKeyIsEqualToItself()
52-
{
53-
Assert.True(_architectureCacheKey.Equals(_architectureCacheKey));
41+
Assert.Equal(_architectureCacheKey, (ArchitectureCacheKey)contentEquivalent, ArchitectureCacheKeysHaveSameToString);
5442
}
5543

5644
[Fact]
@@ -62,7 +50,7 @@ public void DuplicateAssemblies()
6250
duplicateCacheKey.Add(_baseClassModuleName, null);
6351
duplicateCacheKey.Add(_baseClassModuleName, null);
6452

65-
Assert.Equal(_architectureCacheKey, duplicateCacheKey);
53+
Assert.Equal(_architectureCacheKey, duplicateCacheKey, ArchitectureCacheKeysHaveSameToString);
6654
}
6755

6856
[Fact]
@@ -75,7 +63,7 @@ public void DuplicateAssembliesDifferentOrder()
7563
reverseOrderCacheKey.Add(_architectureCacheTestsClassModuleName, null);
7664
reverseOrderCacheKey.Add(_baseClassModuleName, null);
7765

78-
Assert.Equal(_architectureCacheKey, reverseOrderCacheKey);
66+
Assert.Equal(_architectureCacheKey, reverseOrderCacheKey, ArchitectureCacheKeysHaveSameToString);
7967
}
8068

8169
[Fact]
@@ -87,7 +75,7 @@ public void DuplicateFilteredNamespaces()
8775
duplicateCacheKey.Add(_baseClassModuleName, _memberDependencyTests);
8876
duplicateCacheKey.Add(_baseClassModuleName, _memberDependencyTests);
8977

90-
Assert.Equal(_architectureCacheKey, duplicateCacheKey);
78+
Assert.Equal(_architectureCacheKey, duplicateCacheKey, ArchitectureCacheKeysHaveSameToString);
9179
}
9280

9381
[Fact]
@@ -100,7 +88,7 @@ public void DuplicateNamespacesDifferentOrder()
10088
reverseOrderCacheKey.Add(_baseClassModuleName, _attributeDependencyTests);
10189
reverseOrderCacheKey.Add(_baseClassModuleName, _memberDependencyTests);
10290

103-
Assert.Equal(_architectureCacheKey, reverseOrderCacheKey);
91+
Assert.Equal(_architectureCacheKey, reverseOrderCacheKey, ArchitectureCacheKeysHaveSameToString);
10492
}
10593

10694
[Fact]
@@ -109,16 +97,21 @@ public void SameArchitecturesProduceSameArchitectureCacheKey()
10997
_architectureCacheKey.Add(_baseClassModuleName, null);
11098
_duplicateArchitectureCacheKey.Add(_baseClassModuleName, null);
11199

112-
Assert.Equal(_architectureCacheKey, _duplicateArchitectureCacheKey);
100+
Assert.Equal(_architectureCacheKey, _duplicateArchitectureCacheKey, ArchitectureCacheKeysHaveSameToString);
113101
}
114102

115103
[Fact]
116-
public void SameObjectReferenceIsSameArchitectureCacheKet()
104+
public void SameObjectReferenceIsSameArchitectureCacheKey()
117105
{
118106
_architectureCacheKey.Add(_baseClassModuleName, null);
119107
object referenceDuplicate = _architectureCacheKey;
120108

121109
Assert.True(_architectureCacheKey.Equals(referenceDuplicate));
122110
}
111+
112+
private static bool ArchitectureCacheKeysHaveSameToString(ArchitectureCacheKey first, ArchitectureCacheKey second)
113+
{
114+
return first.ToString().Equals(second.ToString());
115+
}
123116
}
124117
}

ArchUnitNETTests/Domain/ArchitectureCacheTests.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,5 @@ public void GetExistingArchitecture()
4444
_testEmptyArchitecture
4545
);
4646
}
47-
48-
[Fact]
49-
public void CacheClear()
50-
{
51-
_testArchitectureCache.Add(_testArchitectureCacheKey, _testEmptyArchitecture);
52-
Assert.Equal(
53-
_testArchitectureCache.TryGetArchitecture(_testArchitectureCacheKey),
54-
_testEmptyArchitecture
55-
);
56-
_testArchitectureCache.Clear();
57-
Assert.Null(_testArchitectureCache.TryGetArchitecture(_testArchitectureCacheKey));
58-
}
5947
}
6048
}

ArchUnitNETTests/Domain/TestArchitectureCache.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ namespace ArchUnitNETTests.Domain
44
{
55
public class TestArchitectureCache : ArchitectureCache
66
{
7-
public int Size()
7+
public long Size()
88
{
9-
return Cache.Count;
9+
return _cache.GetCount();
1010
}
1111
}
1212
}

0 commit comments

Comments
 (0)