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);
            }
        }
Example #2
0
        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);
        }
Example #3
0
 /// <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);