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);
}
}