public static ComponentBase Create(IDictionary<string, string> globalValues, ConfigSection section, int index)
        {
            if (!section.ContainsKey(ComponentTypeString))
            {
                throw new ArgumentException("No ComponentType given for section: " + section.Name);
            }

            //assign all global values to the local configSection.
            IDictionary<string, string> localValues = section.ValuesAsDictionary;
            foreach (KeyValuePair<string, string> globalValue in globalValues)
            {
                if (!localValues.ContainsKey(globalValue.Key))
                {
                    localValues.Add(globalValue.Key, globalValue.Value);
                }
            }

            ComponentBase item = null;

            switch (ParseToComponentType(section[ComponentTypeString]))
            {
                case ComponentType.FileInstaller:
                    item = new  FileInstallerComponentGraph(section.Name, localValues);
                    break;
                case ComponentType.FileRemover:
                    item = new FileRemoverComponentGraph(section.Name, localValues);
                    break;
                case ComponentType.AppPoolInstaller:
                    item = new AppPoolInstallerComponentGraph(section.Name, localValues);
                    break;
                case ComponentType.WebSiteInstaller:
                case ComponentType.ApplicationInstaller:
                    item =  null;
                    break;
                case ComponentType.RemoteExecutionComponent:
                    item = new RemoteExecutionComponentGraph(section.Name, localValues);
                    break;
                case ComponentType.AppPoolRemover:
                    item = new IisRemoverComponentGraph(section.Name, localValues, ComponentType.AppPoolRemover);
                    break;
                case ComponentType.WebSiteRemover:
                    item = new IisRemoverComponentGraph(section.Name, localValues, ComponentType.WebSiteRemover);
                    break;
                case ComponentType.ApplicationRemover:
                    item = new IisRemoverComponentGraph(section.Name, localValues, ComponentType.ApplicationRemover);
                    break;
                default:
                    throw new ArgumentException("unknown installer section: " + section[ComponentTypeString]);
            }

            if (item != null)
            {
                item.Index = index;
            }

            return item;
        }