1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Threading ;
3
4
using MongoDB . Configuration . Mapping . Auto ;
4
5
using MongoDB . Configuration . Mapping . Model ;
5
6
@@ -11,6 +12,7 @@ public class AutoMappingStore : IMappingStore
11
12
{
12
13
private readonly IAutoMapper _autoMapper ;
13
14
private readonly Dictionary < Type , IClassMap > _autoMaps ;
15
+ private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim ( LockRecursionPolicy . SupportsRecursion ) ;
14
16
private readonly IMappingStore _wrappedMappingStore ;
15
17
16
18
/// <summary>
@@ -71,23 +73,42 @@ public AutoMappingStore(IAutoMapper autoMapper, IMappingStore mappingStore)
71
73
/// <returns></returns>
72
74
public IClassMap GetClassMap ( Type classType )
73
75
{
74
- IClassMap classMap ;
75
-
76
- if ( _autoMaps . TryGetValue ( classType , out classMap ) )
77
- return classMap ;
78
-
79
- if ( _wrappedMappingStore != null )
76
+ try
80
77
{
81
- classMap = _wrappedMappingStore . GetClassMap ( classType ) ;
82
- if ( classMap != null )
78
+ _lock . EnterUpgradeableReadLock ( ) ;
79
+
80
+ IClassMap classMap ;
81
+ if ( _autoMaps . TryGetValue ( classType , out classMap ) )
83
82
return classMap ;
84
- }
85
83
86
- classMap = _autoMapper . CreateClassMap ( classType , GetClassMap ) ;
84
+ if ( _wrappedMappingStore != null )
85
+ {
86
+ classMap = _wrappedMappingStore . GetClassMap ( classType ) ;
87
+ if ( classMap != null )
88
+ return classMap ;
89
+ }
90
+
91
+ classMap = _autoMapper . CreateClassMap ( classType , GetClassMap ) ;
87
92
88
- _autoMaps . Add ( classType , classMap ) ;
93
+ try
94
+ {
95
+ _lock . EnterWriteLock ( ) ;
89
96
90
- return classMap ;
97
+ _autoMaps . Add ( classType , classMap ) ;
98
+
99
+ return classMap ;
100
+ }
101
+ finally
102
+ {
103
+ if ( _lock . IsWriteLockHeld )
104
+ _lock . ExitWriteLock ( ) ;
105
+ }
106
+ }
107
+ finally
108
+ {
109
+ if ( _lock . IsUpgradeableReadLockHeld )
110
+ _lock . ExitUpgradeableReadLock ( ) ;
111
+ }
91
112
}
92
113
}
93
114
}
0 commit comments