Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
            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);
            }