Пример #1
0
        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);
        }