コード例 #1
0
        protected CacheMapEntry CreateEntry(Type entityType, Object id, sbyte idIndex, Object value,
                                            CacheMapEntry nextEntry)
        {
            ICacheMapEntryFactory factory = cacheMapEntryTypeProvider.GetCacheMapEntryType(entityType, idIndex);

            return(factory.CreateCacheMapEntry(entityType, idIndex, id, value, nextEntry));
        }
コード例 #2
0
        public ICacheMapEntryFactory GetCacheMapEntryType(Type entityType, sbyte idIndex)
        {
            if (BytecodeEnhancer == null)
            {
                return(ci);
            }
            ICacheMapEntryFactory factory = typeToConstructorMap.Get(entityType, idIndex);

            if (factory != null)
            {
                return(factory);
            }
            Lock writeLock = this.writeLock;

            writeLock.Lock();
            try
            {
                // concurrent thread might have been faster
                factory = typeToConstructorMap.Get(entityType, idIndex);
                if (factory != null)
                {
                    return(factory);
                }
                try
                {
                    Type enhancedType = BytecodeEnhancer.GetEnhancedType(typeof(CacheMapEntry), new CacheMapEntryEnhancementHint(entityType, idIndex));
                    if (enhancedType == typeof(CacheMapEntry))
                    {
                        // Nothing has been enhanced
                        factory = ci;
                    }
                    else
                    {
                        factory = AccessorTypeProvider.GetConstructorType <ICacheMapEntryFactory>(enhancedType);
                    }
                }
                catch (Exception e)
                {
                    if (Log.WarnEnabled)
                    {
                        Log.Warn(e);
                    }
                    // something serious happened during enhancement: continue with a fallback
                    factory = ci;
                }
                typeToConstructorMap.Put(entityType, idIndex, factory);
                return(factory);
            }
            finally
            {
                writeLock.Unlock();
            }
        }