< Summary

Information
Class: Elsa.Workflows.Management.Extensions.ManagementServiceCollectionExtensions
Assembly: Elsa.Workflows.Management
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Management/Extensions/ManagementServiceCollectionExtensions.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 22
Coverable lines: 22
Total lines: 108
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 12
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddActivities(...)0%620%
AddActivity(...)100%210%
AddActivitiesFrom(...)0%7280%
AddActivitiesFrom(...)100%210%
AddVariableDescriptors(...)0%620%
AddVariableDescriptor(...)100%210%
AddVariableDescriptor(...)100%210%
AddVariableTypeAndAlias(...)100%210%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Management/Extensions/ManagementServiceCollectionExtensions.cs

#LineLine coverage
 1using System.Reflection;
 2using Elsa.Expressions.Extensions;
 3using Elsa.Workflows.Management.Models;
 4using Elsa.Workflows.Management.Options;
 5using Elsa.Workflows.Options;
 6using Microsoft.Extensions.DependencyInjection;
 7using Elsa.Common.Serialization;
 8
 9// ReSharper disable once CheckNamespace
 10namespace Elsa.Workflows.Management.Extensions;
 11
 12/// <summary>
 13/// <see cref="IServiceCollection"/> extension methods for registering Elsa activity types
 14/// and variable descriptors via <see cref="ManagementOptions"/>.
 15/// </summary>
 16/// <remarks>
 17/// These extensions are the shell-feature-compatible replacement for calling
 18/// <c>WorkflowManagementFeature.AddActivitiesFrom&lt;T&gt;()</c> in the old-style feature system.
 19/// Because <c>services.Configure&lt;ManagementOptions&gt;</c> is additive, multiple features
 20/// can independently register activities without any coupling to each other.
 21/// </remarks>
 22public static class ManagementServiceCollectionExtensions
 23{
 24    // -------------------------------------------------------------------------
 25    // Activities
 26    // -------------------------------------------------------------------------
 27
 28    /// <summary>
 29    /// Registers the supplied activity <paramref name="types"/> with <see cref="ManagementOptions"/>.
 30    /// </summary>
 31    public static IServiceCollection AddActivities(this IServiceCollection services, IEnumerable<Type> types) =>
 032        services.Configure<ManagementOptions>(options =>
 033        {
 034            foreach (var type in types)
 035                options.ActivityTypes.Add(type);
 036        });
 37
 38    /// <summary>
 39    /// Registers a single activity type <typeparamref name="TActivity"/> with <see cref="ManagementOptions"/>.
 40    /// </summary>
 41    public static IServiceCollection AddActivity<TActivity>(this IServiceCollection services)
 42        where TActivity : IActivity =>
 043        services.AddActivities([typeof(TActivity)]);
 44
 45    /// <summary>
 46    /// Scans <paramref name="assembly"/> and registers every concrete, non-generic
 47    /// <see cref="IActivity"/> implementation found.
 48    /// </summary>
 49    public static IServiceCollection AddActivitiesFrom(this IServiceCollection services, Assembly assembly)
 50    {
 051        var types = assembly.GetExportedTypes()
 052            .Where(t => typeof(IActivity).IsAssignableFrom(t)
 053                        && t is { IsAbstract: false, IsInterface: false, IsGenericTypeDefinition: false });
 054        return services.AddActivities(types);
 55    }
 56
 57    /// <summary>
 58    /// Scans the assembly that contains <typeparamref name="TMarker"/> and registers every
 59    /// concrete, non-generic <see cref="IActivity"/> implementation found.
 60    /// </summary>
 61    public static IServiceCollection AddActivitiesFrom<TMarker>(this IServiceCollection services) =>
 062        services.AddActivitiesFrom(typeof(TMarker).Assembly);
 63
 64    // -------------------------------------------------------------------------
 65    // Variable descriptors
 66    // -------------------------------------------------------------------------
 67
 68    /// <summary>
 69    /// Registers the supplied <paramref name="descriptors"/> with <see cref="ManagementOptions"/>.
 70    /// </summary>
 71    public static IServiceCollection AddVariableDescriptors(
 72        this IServiceCollection services,
 73        IEnumerable<VariableDescriptor> descriptors) =>
 074        services.Configure<ManagementOptions>(options =>
 075        {
 076            foreach (var descriptor in descriptors)
 077                options.VariableDescriptors.Add(descriptor);
 078        });
 79
 80    /// <summary>
 81    /// Registers a single variable descriptor.
 82    /// </summary>
 83    public static IServiceCollection AddVariableDescriptor(
 84        this IServiceCollection services,
 85        VariableDescriptor descriptor) =>
 086        services.AddVariableDescriptors([descriptor]);
 87
 88    /// <summary>
 89    /// Registers a variable descriptor for <typeparamref name="T"/> with the given
 90    /// <paramref name="category"/> and optional <paramref name="description"/>.
 91    /// </summary>
 92    public static IServiceCollection AddVariableDescriptor<T>(
 93        this IServiceCollection services,
 94        string category,
 95        string? description = null) =>
 096        services.AddVariableDescriptor(new(typeof(T), category, description));
 97
 98    /// <summary>
 99    /// Adds a variable type and its alias to the specified service collection.
 100    /// </summary>
 101    public static IServiceCollection AddVariableTypeAndAlias<T>(this IServiceCollection services, string alias, string c
 102    {
 0103        services.Configure<SerializationTypeOptions>(options => options.RegisterTypeAlias(typeof(T), alias));
 0104        return services
 0105            .AddVariableDescriptor<T>(category)
 0106            .AddTypeAlias<T>(alias);
 107    }
 108}