diff --git a/ArchUnitNET/ArchUnitNET.csproj b/ArchUnitNET/ArchUnitNET.csproj
index c773a205..3df0d032 100644
--- a/ArchUnitNET/ArchUnitNET.csproj
+++ b/ArchUnitNET/ArchUnitNET.csproj
@@ -22,6 +22,7 @@
+
diff --git a/ArchUnitNET/Domain/ArchitectureCache.cs b/ArchUnitNET/Domain/ArchitectureCache.cs
index 7e47e9a6..86aa2673 100644
--- a/ArchUnitNET/Domain/ArchitectureCache.cs
+++ b/ArchUnitNET/Domain/ArchitectureCache.cs
@@ -1,11 +1,10 @@
-using System.Collections.Concurrent;
+using System.Runtime.Caching;
namespace ArchUnitNET.Domain
{
public class ArchitectureCache
{
- protected readonly ConcurrentDictionary Cache =
- new ConcurrentDictionary();
+ protected readonly MemoryCache _cache = new MemoryCache(nameof(ArchitectureCache));
protected ArchitectureCache() { }
@@ -13,16 +12,12 @@ protected ArchitectureCache() { }
public Architecture TryGetArchitecture(ArchitectureCacheKey architectureCacheKey)
{
- return Cache.TryGetValue(architectureCacheKey, out var matchArchitecture)
- ? matchArchitecture
- : null;
+ return _cache.Get(architectureCacheKey.ToString()) as Architecture;
}
- public bool Add(ArchitectureCacheKey architectureCacheKey, Architecture architecture)
+ public void Add(ArchitectureCacheKey architectureCacheKey, Architecture architecture)
{
- return Cache.TryAdd(architectureCacheKey, architecture);
+ _cache.Add(architectureCacheKey.ToString(), architecture, new CacheItemPolicy());
}
-
- public void Clear() => Cache.Clear();
}
}
diff --git a/ArchUnitNET/Domain/ArchitectureCacheKey.cs b/ArchUnitNET/Domain/ArchitectureCacheKey.cs
index 3c075420..58e0c927 100644
--- a/ArchUnitNET/Domain/ArchitectureCacheKey.cs
+++ b/ArchUnitNET/Domain/ArchitectureCacheKey.cs
@@ -5,48 +5,19 @@
namespace ArchUnitNET.Domain
{
- public class ArchitectureCacheKey : IEquatable
+ public class ArchitectureCacheKey
{
private readonly SortedSet<(string moduleName, string filter)> _architectureCacheKey =
new SortedSet<(string moduleName, string filter)>(new ArchitectureCacheKeyComparer());
- public bool Equals(ArchitectureCacheKey other)
- {
- return other != null
- && _architectureCacheKey.SequenceEqual(other._architectureCacheKey);
- }
-
public void Add(string moduleName, string filter)
{
_architectureCacheKey.Add((moduleName, filter));
}
- public override bool Equals(object obj)
- {
- if (ReferenceEquals(null, obj))
- {
- return false;
- }
-
- if (ReferenceEquals(this, obj))
- {
- return true;
- }
-
- return obj.GetType() == GetType() && Equals((ArchitectureCacheKey)obj);
- }
-
- public override int GetHashCode()
+ public override string ToString()
{
- unchecked
- {
- var hashCode = 397;
- _architectureCacheKey.ForEach(tuple =>
- {
- hashCode = (hashCode * 131) ^ tuple.GetHashCode();
- });
- return hashCode;
- }
+ return string.Join(",", _architectureCacheKey);
}
}
diff --git a/ArchUnitNETTests/Domain/ArchitectureCacheKeyTests.cs b/ArchUnitNETTests/Domain/ArchitectureCacheKeyTests.cs
index cfae7ae6..e62f9663 100644
--- a/ArchUnitNETTests/Domain/ArchitectureCacheKeyTests.cs
+++ b/ArchUnitNETTests/Domain/ArchitectureCacheKeyTests.cs
@@ -35,22 +35,10 @@ public ArchitectureCacheKeyTests()
private readonly ArchitectureCacheKey _duplicateArchitectureCacheKey;
[Fact]
- public void ArchitectureCacheKeyContentEquivalentsAreEqual()
+ public void ArchitectureCacheKeyContentEquivalentsAreStringEqual()
{
object contentEquivalent = new ArchitectureCacheKey();
- Assert.True(_architectureCacheKey.Equals(contentEquivalent));
- }
-
- [Fact]
- public void ArchitectureCacheKeyDoesNotEqualNull()
- {
- Assert.False(_architectureCacheKey.Equals((object)null));
- }
-
- [Fact]
- public void ArchitectureCacheKeyIsEqualToItself()
- {
- Assert.True(_architectureCacheKey.Equals(_architectureCacheKey));
+ Assert.Equal(_architectureCacheKey, (ArchitectureCacheKey)contentEquivalent, ArchitectureCacheKeysHaveSameToString);
}
[Fact]
@@ -62,7 +50,7 @@ public void DuplicateAssemblies()
duplicateCacheKey.Add(_baseClassModuleName, null);
duplicateCacheKey.Add(_baseClassModuleName, null);
- Assert.Equal(_architectureCacheKey, duplicateCacheKey);
+ Assert.Equal(_architectureCacheKey, duplicateCacheKey, ArchitectureCacheKeysHaveSameToString);
}
[Fact]
@@ -75,7 +63,7 @@ public void DuplicateAssembliesDifferentOrder()
reverseOrderCacheKey.Add(_architectureCacheTestsClassModuleName, null);
reverseOrderCacheKey.Add(_baseClassModuleName, null);
- Assert.Equal(_architectureCacheKey, reverseOrderCacheKey);
+ Assert.Equal(_architectureCacheKey, reverseOrderCacheKey, ArchitectureCacheKeysHaveSameToString);
}
[Fact]
@@ -87,7 +75,7 @@ public void DuplicateFilteredNamespaces()
duplicateCacheKey.Add(_baseClassModuleName, _memberDependencyTests);
duplicateCacheKey.Add(_baseClassModuleName, _memberDependencyTests);
- Assert.Equal(_architectureCacheKey, duplicateCacheKey);
+ Assert.Equal(_architectureCacheKey, duplicateCacheKey, ArchitectureCacheKeysHaveSameToString);
}
[Fact]
@@ -100,7 +88,7 @@ public void DuplicateNamespacesDifferentOrder()
reverseOrderCacheKey.Add(_baseClassModuleName, _attributeDependencyTests);
reverseOrderCacheKey.Add(_baseClassModuleName, _memberDependencyTests);
- Assert.Equal(_architectureCacheKey, reverseOrderCacheKey);
+ Assert.Equal(_architectureCacheKey, reverseOrderCacheKey, ArchitectureCacheKeysHaveSameToString);
}
[Fact]
@@ -109,16 +97,21 @@ public void SameArchitecturesProduceSameArchitectureCacheKey()
_architectureCacheKey.Add(_baseClassModuleName, null);
_duplicateArchitectureCacheKey.Add(_baseClassModuleName, null);
- Assert.Equal(_architectureCacheKey, _duplicateArchitectureCacheKey);
+ Assert.Equal(_architectureCacheKey, _duplicateArchitectureCacheKey, ArchitectureCacheKeysHaveSameToString);
}
[Fact]
- public void SameObjectReferenceIsSameArchitectureCacheKet()
+ public void SameObjectReferenceIsSameArchitectureCacheKey()
{
_architectureCacheKey.Add(_baseClassModuleName, null);
object referenceDuplicate = _architectureCacheKey;
Assert.True(_architectureCacheKey.Equals(referenceDuplicate));
}
+
+ private static bool ArchitectureCacheKeysHaveSameToString(ArchitectureCacheKey first, ArchitectureCacheKey second)
+ {
+ return first.ToString().Equals(second.ToString());
+ }
}
}
diff --git a/ArchUnitNETTests/Domain/ArchitectureCacheTests.cs b/ArchUnitNETTests/Domain/ArchitectureCacheTests.cs
index d1752dbd..f121b594 100644
--- a/ArchUnitNETTests/Domain/ArchitectureCacheTests.cs
+++ b/ArchUnitNETTests/Domain/ArchitectureCacheTests.cs
@@ -44,17 +44,5 @@ public void GetExistingArchitecture()
_testEmptyArchitecture
);
}
-
- [Fact]
- public void CacheClear()
- {
- _testArchitectureCache.Add(_testArchitectureCacheKey, _testEmptyArchitecture);
- Assert.Equal(
- _testArchitectureCache.TryGetArchitecture(_testArchitectureCacheKey),
- _testEmptyArchitecture
- );
- _testArchitectureCache.Clear();
- Assert.Null(_testArchitectureCache.TryGetArchitecture(_testArchitectureCacheKey));
- }
}
}
diff --git a/ArchUnitNETTests/Domain/TestArchitectureCache.cs b/ArchUnitNETTests/Domain/TestArchitectureCache.cs
index 6c2c4028..869f2943 100644
--- a/ArchUnitNETTests/Domain/TestArchitectureCache.cs
+++ b/ArchUnitNETTests/Domain/TestArchitectureCache.cs
@@ -4,9 +4,9 @@ namespace ArchUnitNETTests.Domain
{
public class TestArchitectureCache : ArchitectureCache
{
- public int Size()
+ public long Size()
{
- return Cache.Count;
+ return _cache.GetCount();
}
}
}