예제 #1
0
 public IActivityBuilder Add(
     IActivityBuilder activityBuilder,
     Action <IActivityBuilder>?branch = default)
 {
     branch?.Invoke(activityBuilder);
     ActivityBuilders.Add(activityBuilder);
     return(activityBuilder);
 }
예제 #2
0
        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);
        }