Ejemplo n.º 1
0
        public TypeFactoryBinding GetBindingFromMap(TypeFactoryMap map)
        {
            TypeFactoryBinding retVal = null;

            if (!typeFactoryLoaderCache.TryGetValue(map.Definition, out retVal))
            {
                lock (syncLock)
                {
                    if (!typeFactoryLoaderCache.TryGetValue(map.Definition, out retVal))
                    {
                        retVal = map.Definition.GetBinding();
                        typeFactoryLoaderCache.Add(map.Definition, retVal);
                    }
                }
            }
            return retVal;
        }
Ejemplo n.º 2
0
        public TypeFactoryMap GetMapForType(Type baseType, string name, bool isExplicitType, Stack<TypeFactoryMap> currentStack)
        {
            string key = name.ToLower();
            Dictionary<string,TypeFactoryMap> typeLoaderMap = null;
            if (!typeFactoryLoaderMap.TryGetValue(baseType, out typeLoaderMap))
            {
                lock(syncLock)
                {
                    if (!typeFactoryLoaderMap.TryGetValue(baseType, out typeLoaderMap))
                    {
                        typeLoaderMap = new Dictionary<string,TypeFactoryMap>();
                        typeFactoryLoaderMap.Add(baseType,typeLoaderMap);
                    }
                }
            }

            TypeFactoryMap returnMap = null;
            if (!typeLoaderMap.TryGetValue(key, out returnMap))
            {
                lock(syncLock)
                {
                    if (!typeLoaderMap.TryGetValue(key, out returnMap))
                    {
                        if (currentStack == null)
                            currentStack = new Stack<TypeFactoryMap>();
                        if (currentStack.Any(item => item.Name.ToLowerInvariant() == key && item.BaseType == baseType))
                            throw new ArgumentException("Mapping for type '" + baseType.FullName + "' on name '" + name + "' has a circular dependency.");
                        returnMap = new TypeFactoryMap(name, baseType, isExplicitType, this);
                        currentStack.Push(returnMap);
                        returnMap.Init(currentStack);
                        currentStack.Pop();
                        typeLoaderMap.Add(key,returnMap);
                        if (returnMap.Definition.IsSingleton)
                            GetBindingFromMap(returnMap);
                    }
                }
            }

            return returnMap;
        }
Ejemplo n.º 3
0
        public TypeFactoryDefinition GetTypeFactoryDefinition(TypeFactoryMap map, Stack<TypeFactoryMap> current)
        {
            var definition = new TypeFactoryDefinition(map, current);
            TypeFactoryDefinition result = null;

            if (!typeFactoryDefinitions.TryGetValue(definition, out result))
            {
                lock (syncLock)
                {
                    if (!typeFactoryDefinitions.TryGetValue(definition, out result))
                    {
                        typeFactoryDefinitions.Add(definition, definition);
                        result = definition;
                    }
                }
            }

            return result;
        }