static IObjectActivator GetObjectActivator(Type type, IDataReader reader) { if (type == PublicConstants.TypeOfObject || type == typeof(DapperRow)) { return(new DapperRowObjectActivator()); } List <CacheInfo> caches; if (!ObjectActivatorCache.TryGetValue(type, out caches)) { if (!Monitor.TryEnter(type)) { return(CreateObjectActivator(type, reader)); } try { caches = ObjectActivatorCache.GetOrAdd(type, new List <CacheInfo>(1)); } finally { Monitor.Exit(type); } } CacheInfo cache = TryGetCacheInfoFromList(caches, reader); if (cache == null) { lock (caches) { cache = TryGetCacheInfoFromList(caches, reader); if (cache == null) { ComplexObjectActivator activator = CreateObjectActivator(type, reader); cache = new CacheInfo(activator, reader); caches.Add(cache); } } } return(cache.ObjectActivator); }
static ObjectActivator GetObjectActivator(Type type, IDataReader reader) { List <CacheInfo> caches; if (!ObjectActivatorCache.TryGetValue(type, out caches)) { if (!Monitor.TryEnter(type)) { return(CreateObjectActivator(type, reader)); } try { caches = ObjectActivatorCache.GetOrAdd(type, new List <CacheInfo>(1)); } finally { Monitor.Exit(type); } } CacheInfo cache = TryGetCacheInfoFromList(caches, reader); if (cache == null) { lock (caches) { cache = TryGetCacheInfoFromList(caches, reader); if (cache == null) { ObjectActivator activator = CreateObjectActivator(type, reader); cache = new CacheInfo(activator, reader); caches.Add(cache); } } } return(cache.ObjectActivator); }