Beispiel #1
0
        bool ActivateFeature(FeatureInfo featureInfo, List <FeatureInfo> featuresToActivate, IConfigureComponents container, PipelineSettings pipelineSettings, RoutingComponent routing, ReceiveConfiguration receiveConfiguration)
        {
            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, container, pipelineSettings, routing, receiveConfiguration)));
            };
            var featureType = featureInfo.Feature.GetType();

            if (featureInfo.Feature.Dependencies.All(dependencyActivator))
            {
                featureInfo.Diagnostics.DependenciesAreMet = true;

                var context = new FeatureConfigurationContext(settings, container, pipelineSettings, routing, receiveConfiguration);
                if (!HasAllPrerequisitesSatisfied(featureInfo.Feature, featureInfo.Diagnostics, context))
                {
                    settings.MarkFeatureAsDeactivated(featureType);
                    return(false);
                }
                settings.MarkFeatureAsActive(featureType);
                featureInfo.Feature.SetupFeature(context);
                featureInfo.TaskControllers          = context.TaskControllers;
                featureInfo.Diagnostics.StartupTasks = context.TaskControllers.Select(d => d.Name).ToList();
                featureInfo.Diagnostics.Active       = true;
                return(true);
            }
            settings.MarkFeatureAsDeactivated(featureType);
            featureInfo.Diagnostics.DependenciesAreMet = false;
            return(false);
        }
Beispiel #2
0
        public FeatureDiagnosticData[] SetupFeatures(IConfigureComponents container, PipelineSettings pipelineSettings, RoutingComponent routing, ReceiveConfiguration receiveConfiguration)
        {
            // featuresToActivate is enumerated twice because after setting defaults some new features might got activated.
            var sourceFeatures = Sort(features);

            var enabledFeatures = new List <FeatureInfo>();

            while (true)
            {
                var featureToActivate = sourceFeatures.FirstOrDefault(x => settings.IsFeatureEnabled(x.Feature.GetType()));
                if (featureToActivate == null)
                {
                    break;
                }
                sourceFeatures.Remove(featureToActivate);
                enabledFeatures.Add(featureToActivate);
                featureToActivate.Feature.ConfigureDefaults(settings);
            }

            foreach (var feature in enabledFeatures)
            {
                ActivateFeature(feature, enabledFeatures, container, pipelineSettings, routing, receiveConfiguration);
            }

            settings.PreventChanges();

            return(features.Select(t => t.Diagnostics).ToArray());
        }
        internal FeatureConfigurationContext(ReadOnlySettings settings, IConfigureComponents container, PipelineSettings pipelineSettings, RoutingComponent routing, ReceiveConfiguration receiving)
        {
            Settings       = settings;
            Container      = container;
            Pipeline       = pipelineSettings;
            Routing        = routing;
            this.receiving = receiving;

            TaskControllers = new List <FeatureStartupTaskController>();
        }