1
1
using System ;
2
- using System . Collections ;
3
2
using System . Collections . Generic ;
4
3
5
4
namespace ReactiveDomain . Foundation . StreamStore
@@ -20,7 +19,7 @@ public class ReadThroughAggregateCache : IAggregateCache, IDisposable
20
19
{
21
20
22
21
private readonly IRepository _baseRepository ;
23
- private readonly Dictionary < Guid , IEventSource > _knownAggregates = new Dictionary < Guid , IEventSource > ( ) ;
22
+ private readonly Dictionary < ( Type type , Guid id ) , IEventSource > _knownAggregates = new Dictionary < ( Type type , Guid id ) , IEventSource > ( ) ;
24
23
public ReadThroughAggregateCache ( IRepository baseRepository ) {
25
24
_baseRepository = baseRepository ;
26
25
}
@@ -31,32 +30,32 @@ public bool TryGetById<TAggregate>(Guid id, out TAggregate aggregate, int versio
31
30
}
32
31
catch ( Exception ) {
33
32
aggregate = null ;
34
- Remove ( id ) ;
33
+ Remove < TAggregate > ( id ) ;
35
34
return false ;
36
35
}
37
36
}
38
37
39
38
public TAggregate GetById < TAggregate > ( Guid id , int version = int . MaxValue ) where TAggregate : class , IEventSource {
40
- if ( _knownAggregates . TryGetValue ( id , out var cached ) ) {
39
+ if ( _knownAggregates . TryGetValue ( ( typeof ( TAggregate ) , id ) , out var cached ) ) {
41
40
var agg = ( TAggregate ) cached ;
42
41
Update ( ref agg , version ) ;
43
42
return ( TAggregate ) cached ;
44
43
}
45
44
46
45
var aggregate = _baseRepository . GetById < TAggregate > ( id , version ) ;
47
- _knownAggregates . Add ( id , aggregate ) ;
46
+ _knownAggregates . Add ( ( typeof ( TAggregate ) , id ) , aggregate ) ;
48
47
return aggregate ;
49
48
}
50
49
51
50
public void Update < TAggregate > ( ref TAggregate aggregate , int version = int . MaxValue ) where TAggregate : class , IEventSource {
52
51
if ( aggregate == null ) throw new ArgumentNullException ( nameof ( aggregate ) ) ;
53
52
if ( aggregate . ExpectedVersion == version ) return ;
54
53
55
- _knownAggregates . TryGetValue ( aggregate . Id , out var cached ) ;
54
+ _knownAggregates . TryGetValue ( ( typeof ( TAggregate ) , aggregate . Id ) , out var cached ) ;
56
55
57
56
if ( cached == null ) {
58
57
_baseRepository . Update ( ref aggregate , version ) ;
59
- UpdateCache ( aggregate ) ;
58
+ UpdateCache < TAggregate > ( aggregate ) ;
60
59
return ;
61
60
}
62
61
@@ -74,34 +73,35 @@ public void Update<TAggregate>(ref TAggregate aggregate, int version = int.MaxVa
74
73
//cache is ahead of item, but behind requested version
75
74
aggregate = ( TAggregate ) cached ;
76
75
_baseRepository . Update ( ref aggregate , version ) ;
77
- UpdateCache ( aggregate ) ;
76
+ UpdateCache < TAggregate > ( aggregate ) ;
78
77
}
79
78
80
79
81
80
82
- private void UpdateCache ( IEventSource aggregate ) {
83
- if ( _knownAggregates . TryGetValue ( aggregate . Id , out var cached ) ) {
81
+ private void UpdateCache < TAggregate > ( IEventSource aggregate ) {
82
+ if ( _knownAggregates . TryGetValue ( ( typeof ( TAggregate ) , aggregate . Id ) , out var cached ) ) {
84
83
if ( cached . ExpectedVersion < aggregate . ExpectedVersion ) {
85
- _knownAggregates [ aggregate . Id ] = aggregate ;
84
+ _knownAggregates [ ( typeof ( TAggregate ) , aggregate . Id ) ] = aggregate ;
86
85
}
87
86
}
88
87
else {
89
- _knownAggregates . Add ( aggregate . Id , aggregate ) ;
88
+ _knownAggregates . Add ( ( typeof ( TAggregate ) , aggregate . Id ) , aggregate ) ;
90
89
}
91
90
}
92
91
93
92
public void Save ( IEventSource aggregate ) {
93
+ var type = aggregate . GetType ( ) ;
94
94
try {
95
95
_baseRepository . Save ( aggregate ) ;
96
- if ( ! _knownAggregates . ContainsKey ( aggregate . Id ) ) {
97
- _knownAggregates . Add ( aggregate . Id , aggregate ) ;
96
+ if ( ! _knownAggregates . ContainsKey ( ( type , aggregate . Id ) ) ) {
97
+ _knownAggregates . Add ( ( type , aggregate . Id ) , aggregate ) ;
98
98
}
99
99
else {
100
- _knownAggregates [ aggregate . Id ] = aggregate ;
100
+ _knownAggregates [ ( type , aggregate . Id ) ] = aggregate ;
101
101
}
102
102
}
103
103
catch {
104
- _knownAggregates . Remove ( aggregate . Id ) ;
104
+ _knownAggregates . Remove ( ( type , aggregate . Id ) ) ;
105
105
}
106
106
107
107
@@ -113,7 +113,7 @@ public void Save(IEventSource aggregate) {
113
113
/// <param name="aggregate">The aggregate to be deleted.</param>
114
114
public void Delete ( IEventSource aggregate ) {
115
115
_baseRepository . Delete ( aggregate ) ;
116
- _knownAggregates . Remove ( aggregate . Id ) ;
116
+ _knownAggregates . Remove ( ( aggregate . GetType ( ) , aggregate . Id ) ) ;
117
117
}
118
118
119
119
/// <summary>
@@ -122,11 +122,11 @@ public void Delete(IEventSource aggregate) {
122
122
/// <param name="aggregate">The aggregate to be deleted.</param>
123
123
public void HardDelete ( IEventSource aggregate ) {
124
124
_baseRepository . HardDelete ( aggregate ) ;
125
- _knownAggregates . Remove ( aggregate . Id ) ;
125
+ _knownAggregates . Remove ( ( aggregate . GetType ( ) , aggregate . Id ) ) ;
126
126
}
127
127
128
- public bool Remove ( Guid id ) {
129
- return _knownAggregates . Remove ( id ) ;
128
+ public bool Remove < TAggregate > ( Guid id ) {
129
+ return _knownAggregates . Remove ( ( typeof ( TAggregate ) , id ) ) ;
130
130
}
131
131
public void Clear ( ) {
132
132
_knownAggregates . Clear ( ) ;
0 commit comments