public IActivityBuilder Add( IActivityBuilder activityBuilder, Action <IActivityBuilder>?branch = default) { branch?.Invoke(activityBuilder); ActivityBuilders.Add(activityBuilder); return(activityBuilder); }
public ICompositeActivityBlueprint Build(string activityIdPrefix = "activity") { var compositeActivityBlueprint = new CompositeActivityBlueprint { Id = ActivityId, Name = Name, DisplayName = DisplayName, Description = Description, Type = ActivityTypeName, PersistOutput = PersistOutputEnabled, PersistWorkflow = PersistWorkflowEnabled, LoadWorkflowContext = LoadWorkflowContextEnabled, SaveWorkflowContext = SaveWorkflowContextEnabled }; var activityBuilders = ActivityBuilders.ToList(); var activityBlueprints = new List <IActivityBlueprint>(); var connections = new List <IConnection>(); var activityPropertyProviders = new Dictionary <string, IDictionary <string, IActivityPropertyValueProvider> >(); // Assign automatic ids to activity builders. var index = 0; foreach (var activityBuilder in activityBuilders) { var activityId = activityBuilder.ActivityId; activityBuilder.ActivityId = string.IsNullOrWhiteSpace(activityId) ? $"{activityIdPrefix}-{++index}" : $"{activityIdPrefix}-{activityId}"; } activityBlueprints.AddRange(activityBuilders.Select(x => BuildActivityBlueprint(x, compositeActivityBlueprint))); var activityBlueprintDictionary = activityBlueprints.ToDictionary(x => x.Id); connections.AddRange(ConnectionBuilders.Select(x => new Connection(activityBlueprintDictionary[x.Source().ActivityId], activityBlueprintDictionary[x.Target().ActivityId], x.Outcome))); compositeActivityBlueprint.Connections = connections; compositeActivityBlueprint.Activities = activityBlueprints; compositeActivityBlueprint.ActivityPropertyProviders = new ActivityPropertyProviders(activityPropertyProviders); // Build composite activities. var compositeActivityBuilders = activityBuilders.Where(x => typeof(CompositeActivity).IsAssignableFrom(x.ActivityType)); BuildCompositeActivities(compositeActivityBuilders, activityBlueprints, connections, activityPropertyProviders); activityPropertyProviders.AddRange( activityBuilders .Select(x => (x.ActivityId, x.PropertyValueProviders)) .ToDictionary(x => x.ActivityId !, x => x.PropertyValueProviders !)); return(compositeActivityBlueprint); }