diff --git a/src/Umbraco.Infrastructure/Mapping/UmbracoMapper.cs b/src/Umbraco.Infrastructure/Mapping/UmbracoMapper.cs index 8ebd803aac..85fa7ad38c 100644 --- a/src/Umbraco.Infrastructure/Mapping/UmbracoMapper.cs +++ b/src/Umbraco.Infrastructure/Mapping/UmbracoMapper.cs @@ -43,8 +43,8 @@ public class UmbracoMapper : IUmbracoMapper // note // // the outer dictionary *can* be modified, see GetCtor and GetMap, hence have to be ConcurrentDictionary - // the inner dictionaries are never modified and therefore can be simple Dictionary - private readonly ConcurrentDictionary>> _ctors = + // the inner dictionaries can also be modified, see GetCtor and therefore also needs to be a ConcurrentDictionary + private readonly ConcurrentDictionary>> _ctors = new(); private readonly ConcurrentDictionary>> _maps = @@ -129,7 +129,7 @@ public class UmbracoMapper : IUmbracoMapper Type sourceType = typeof(TSource); Type targetType = typeof(TTarget); - Dictionary> sourceCtors = DefineCtors(sourceType); + ConcurrentDictionary> sourceCtors = DefineCtors(sourceType); if (ctor != null) { sourceCtors[targetType] = (source, context) => ctor((TSource)source, context)!; @@ -139,8 +139,8 @@ public class UmbracoMapper : IUmbracoMapper sourceMaps[targetType] = (source, target, context) => map((TSource)source, (TTarget)target, context); } - private Dictionary> DefineCtors(Type sourceType) => - _ctors.GetOrAdd(sourceType, _ => new Dictionary>()); + private ConcurrentDictionary> DefineCtors(Type sourceType) => + _ctors.GetOrAdd(sourceType, _ => new ConcurrentDictionary>()); private ConcurrentDictionary> DefineMaps(Type sourceType) => _maps.GetOrAdd(sourceType, _ => new ConcurrentDictionary>()); @@ -391,7 +391,7 @@ public class UmbracoMapper : IUmbracoMapper return null; } - if (_ctors.TryGetValue(sourceType, out Dictionary>? sourceCtor) && + if (_ctors.TryGetValue(sourceType, out ConcurrentDictionary>? sourceCtor) && sourceCtor.TryGetValue(targetType, out Func? ctor)) { return ctor; @@ -399,7 +399,7 @@ public class UmbracoMapper : IUmbracoMapper // we *may* run this more than once but it does not matter ctor = null; - foreach ((Type stype, Dictionary> sctors) in _ctors) + foreach ((Type stype, ConcurrentDictionary> sctors) in _ctors) { if (!stype.IsAssignableFrom(sourceType)) { @@ -427,7 +427,7 @@ public class UmbracoMapper : IUmbracoMapper { if (!v.ContainsKey(c.Key)) { - v.Add(c.Key, c.Value); + v.TryAdd(c.Key, c.Value); } }