public CustomFactoryGenerator(CustomFactoryDefinition definition)
        {
            this.loaderBuilder = DynamicAssemblyManager.DefineType("CustomLoaderFor" + definition.CreationType.Name);
            this.factoryBuilder = DynamicAssemblyManager.DefineType("CustomFactoryFor" + definition.CreationType.Name);
            this.definition = definition;

            GenerateTypes();
        }
        public IFactoryLoader GetLoaderForFactory(Type creationType)
        {
            IFactoryLoader loader = null;
            if (!customFactoryLoaderCache.TryGetValue(creationType, out loader))
            {
                lock(syncLock)
                {
                    if (!customFactoryLoaderCache.TryGetValue(creationType, out loader))
                    {
                        var definition = new CustomFactoryDefinition(creationType, this);
                        var builder = new CustomFactoryGenerator(definition);
                        loader = builder.CreateLoader();
                        customFactoryLoaderCache.Add(creationType, loader);
                    }
                }
            }

            return loader;
        }