bool ActivateFeature(FeatureInfo featureInfo, List <FeatureInfo> featuresToActivate, FeatureConfigurationContext featureConfigurationContext) { if (featureInfo.Feature.IsActive) { return(true); } Func <List <string>, bool> dependencyActivator = dependencies => { var dependentFeaturesToActivate = new List <FeatureInfo>(); foreach (var dependency in dependencies.Select(dependencyName => featuresToActivate .SingleOrDefault(f => f.Feature.Name == dependencyName)) .Where(dependency => dependency != null)) { dependentFeaturesToActivate.Add(dependency); } return(dependentFeaturesToActivate.Aggregate(false, (current, f) => current | ActivateFeature(f, featuresToActivate, featureConfigurationContext))); }; var featureType = featureInfo.Feature.GetType(); if (featureInfo.Feature.Dependencies.All(dependencyActivator)) { featureInfo.Diagnostics.DependenciesAreMet = true; if (!HasAllPrerequisitesSatisfied(featureInfo.Feature, featureInfo.Diagnostics, featureConfigurationContext)) { settings.MarkFeatureAsDeactivated(featureType); return(false); } settings.MarkFeatureAsActive(featureType); featureInfo.InitializeFrom(featureConfigurationContext); // because we reuse the context the task controller list needs to be cleared. featureConfigurationContext.TaskControllers.Clear(); return(true); } settings.MarkFeatureAsDeactivated(featureType); featureInfo.Diagnostics.DependenciesAreMet = false; return(false); }