public PipelineEnvironment(PipelineConfiguration configuration, IServiceProvider serviceProvider = null) { if (configuration is null) { throw new ArgumentNullException(nameof(configuration)); } Debug.WriteLineIf(serviceProvider is null, "no IServiceProvider is provided to the pipeline environment"); Pipeline = PsiPipeline.Create(configuration.Name, configuration.DeliveryPolicy); var instEnvs = new List <ComponentEnvironment>(); Instances = instEnvs; var pending = new List <ComponentConfiguration>(configuration.Instances); while (true) { //find one with all dependencies ready var compConfig = pending.Where(c => ReadyToInstantiate(c, instEnvs)).FirstOrDefault(); if (compConfig is null) //if not found { if (pending.Count > 0) { throw new Exception($"{pending.Count} components cannot be instantiated because their data flow dependencies are not fulfilled."); } break; } pending.Remove(compConfig); var instance = compConfig.Instantiate(Pipeline, instEnvs, serviceProvider); var env = new ComponentEnvironment(compConfig, instance); instEnvs.Add(env); } }
public sealed override object Instantiate(PsiPipeline pipeline, IReadOnlyList <ComponentEnvironment> instantiatedComponents, IServiceProvider serviceProvider) { var instance = Instantiate(pipeline, serviceProvider); Debug.Assert(GetMetadata().InputPorts().All(p => p is StaticPortMetadata)); this.ConnectAllStaticInputs(instance, instantiatedComponents); return(instance); }
/// <summary> /// This method is called to initialize an instance. After the instance is returned, connections of ports will be added. /// </summary> /// <param name="pipeline">The pipeline will be connected to.</param> /// <param name="serviceProvider">A <see cref="IServiceProvider"/> can be used as needed. Can be <see cref="null"/>.</param> /// <returns>An instance of the component initialized using the current configuration.</returns> protected abstract object Instantiate(PsiPipeline pipeline, IServiceProvider serviceProvider);