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); }
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>(); }