using System.Reflection; using Elsa.Expressions.Extensions; using Elsa.Workflows.Management.Models; using Elsa.Workflows.Management.Options; using Microsoft.Extensions.DependencyInjection; // ReSharper disable once CheckNamespace namespace Elsa.Workflows.Management.Extensions; /// /// extension methods for registering Elsa activity types /// and variable descriptors via . /// /// /// These extensions are the shell-feature-compatible replacement for calling /// WorkflowManagementFeature.AddActivitiesFrom<T>() in the old-style feature system. /// Because services.Configure<ManagementOptions> is additive, multiple features /// can independently register activities without any coupling to each other. /// public static class ManagementServiceCollectionExtensions { // ------------------------------------------------------------------------- // Activities // ------------------------------------------------------------------------- /// /// Registers the supplied activity with . /// public static IServiceCollection AddActivities(this IServiceCollection services, IEnumerable types) => services.Configure(options => { foreach (var type in types) options.ActivityTypes.Add(type); }); /// /// Registers a single activity type with . /// public static IServiceCollection AddActivity(this IServiceCollection services) where TActivity : IActivity => services.AddActivities([typeof(TActivity)]); /// /// Scans and registers every concrete, non-generic /// implementation found. /// public static IServiceCollection AddActivitiesFrom(this IServiceCollection services, Assembly assembly) { var types = assembly.GetExportedTypes() .Where(t => typeof(IActivity).IsAssignableFrom(t) && t is { IsAbstract: false, IsInterface: false, IsGenericTypeDefinition: false }); return services.AddActivities(types); } /// /// Scans the assembly that contains and registers every /// concrete, non-generic implementation found. /// public static IServiceCollection AddActivitiesFrom(this IServiceCollection services) => services.AddActivitiesFrom(typeof(TMarker).Assembly); // ------------------------------------------------------------------------- // Variable descriptors // ------------------------------------------------------------------------- /// /// Registers the supplied with . /// public static IServiceCollection AddVariableDescriptors( this IServiceCollection services, IEnumerable descriptors) => services.Configure(options => { foreach (var descriptor in descriptors) options.VariableDescriptors.Add(descriptor); }); /// /// Registers a single variable descriptor. /// public static IServiceCollection AddVariableDescriptor( this IServiceCollection services, VariableDescriptor descriptor) => services.AddVariableDescriptors([descriptor]); /// /// Registers a variable descriptor for with the given /// and optional . /// public static IServiceCollection AddVariableDescriptor( this IServiceCollection services, string category, string? description = null) => services.AddVariableDescriptor(new(typeof(T), category, description)); /// /// Adds a variable type and its alias to the specified service collection. /// public static IServiceCollection AddVariableTypeAndAlias(this IServiceCollection services, string alias, string category) { return services .AddVariableDescriptor(category) .AddTypeAlias(alias); } }