Made ActivityRegistryUpdateService provider specific

This commit is contained in:
Raymond den Haan 2024-06-07 10:53:29 +02:00 committed by raymonddenhaan
parent 90d9561e76
commit c0ee30be5f
7 changed files with 62 additions and 63 deletions

View file

@ -1,6 +1,5 @@
using Elsa.MassTransit.Messages;
using Elsa.Workflows.Contracts;
using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity;
using Elsa.Workflows.Management.Contracts;
using JetBrains.Annotations;
using MassTransit;
@ -10,7 +9,7 @@ namespace Elsa.MassTransit.Consumers;
/// Consumes messages related to workflow definition changes.
/// </summary>
[PublicAPI]
public class WorkflowDefinitionEventsConsumer(IActivityRegistryUpdateService activityRegistryUpdateService) :
public class WorkflowDefinitionEventsConsumer(IWorkflowDefinitionActivityRegistryUpdater workflowDefinitionActivityRegistryUpdater) :
IConsumer<WorkflowDefinitionCreated>,
IConsumer<WorkflowDefinitionDeleted>,
IConsumer<WorkflowDefinitionPublished>,
@ -29,7 +28,7 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryUpdateService act
/// <inheritdoc />
public Task Consume(ConsumeContext<WorkflowDefinitionDeleted> context)
{
activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionFromRegistry(context.Message.Id);
return Task.CompletedTask;
}
@ -42,7 +41,7 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryUpdateService act
/// <inheritdoc />
public Task Consume(ConsumeContext<WorkflowDefinitionRetracted> context)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(context.Message.Id);
return Task.CompletedTask;
}
@ -51,7 +50,7 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryUpdateService act
{
foreach (var id in context.Message.Ids)
{
activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionFromRegistry(id);
}
return Task.CompletedTask;
@ -60,7 +59,7 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryUpdateService act
/// <inheritdoc />
public Task Consume(ConsumeContext<WorkflowDefinitionVersionDeleted> context)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(context.Message.Id);
return Task.CompletedTask;
}
@ -69,7 +68,7 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryUpdateService act
{
foreach (var id in context.Message.Ids)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(id);
}
return Task.CompletedTask;
@ -87,9 +86,9 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryUpdateService act
private Task UpdateDefinition(string id, bool usableAsActivity)
{
if (usableAsActivity)
return activityRegistryUpdateService.AddToRegistry(typeof(WorkflowDefinitionActivityProvider), id);
return workflowDefinitionActivityRegistryUpdater.AddToRegistry(id);
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(id);
return Task.CompletedTask;
}
}

View file

@ -1,32 +0,0 @@
namespace Elsa.Workflows.Contracts;
/// <summary>
/// Represents a service for updating the activity registry.
/// </summary>
public interface IActivityRegistryUpdateService
{
/// <summary>
/// Tries to add a workflow as an activity to the registry.
/// </summary>
/// <param name="providerType">The type of the activity provider.</param>
/// <param name="workflowDefinitionId">The ID of the workflow definition.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddToRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default);
/// <summary>
/// Removes workflow definition activities from the <see cref="IActivityRegistry"/>.
/// </summary>
/// <param name="providerType">The type of the Activity Provider.</param>
/// <param name="workflowDefinitionId">The ID of the workflow definition to remove.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveDefinitionFromRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default);
/// <summary>
/// Removes a workflow definition version activity from the <see cref="IActivityRegistry"/>.
/// </summary>
/// <param name="providerType">The type of the Activity Provider.</param>
/// <param name="workflowDefinitionVersionId">The ID of the workflow definition to remove.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveDefinitionVersionFromRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default);
}

View file

@ -137,7 +137,6 @@ public class WorkflowsFeature : FeatureBase
.AddSingleton<IActivityDescriber, ActivityDescriber>()
.AddSingleton<IActivityRegistry, ActivityRegistry>()
.AddScoped<IActivityRegistryLookupService, ActivityRegistryLookupService>()
.AddScoped<IActivityRegistryUpdateService, ActivityRegistryUpdateService>()
.AddSingleton<IPropertyDefaultValueResolver, PropertyDefaultValueResolver>()
.AddSingleton<IPropertyUIHandlerResolver, PropertyUIHandlerResolver>()
.AddSingleton<IActivityFactory, ActivityFactory>()

View file

@ -0,0 +1,27 @@
namespace Elsa.Workflows.Management.Contracts;
/// <summary>
/// Represents a service for updating the activity registry.
/// </summary>
public interface IWorkflowDefinitionActivityRegistryUpdater
{
/// <summary>
/// Tries to add a workflow as an activity to the registry.
/// </summary>
/// <param name="workflowDefinitionId">The ID of the workflow definition.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddToRegistry(string workflowDefinitionId, CancellationToken cancellationToken = default);
/// <summary>
/// Removes workflow definition activities from the <see cref="Elsa.Workflows.Contracts.IActivityRegistry"/>.
/// </summary>
/// <param name="workflowDefinitionId">The ID of the workflow definition to remove.</param>
void RemoveDefinitionFromRegistry(string workflowDefinitionId);
/// <summary>
/// Removes a workflow definition version activity from the <see cref="Elsa.Workflows.Contracts.IActivityRegistry"/>.
/// </summary>
/// <param name="workflowDefinitionVersionId">The ID of the workflow definition to remove.</param>
void RemoveDefinitionVersionFromRegistry(string workflowDefinitionVersionId);
}

View file

@ -201,6 +201,9 @@ public class WorkflowManagementFeature : FeatureBase
.AddMemoryStore<WorkflowDefinition, MemoryWorkflowDefinitionStore>()
.AddMemoryStore<WorkflowInstance, MemoryWorkflowInstanceStore>()
.AddActivityProvider<TypedActivityProvider>()
.AddActivityProvider<WorkflowDefinitionActivityProvider>()
.AddScoped<WorkflowDefinitionActivityProvider>()
.AddScoped<IWorkflowDefinitionActivityRegistryUpdater, WorkflowDefinitionActivityRegistryUpdater>()
.AddScoped<IWorkflowDefinitionService, WorkflowDefinitionService>()
.AddScoped<IWorkflowSerializer, WorkflowSerializer>()
.AddScoped<IWorkflowValidator, WorkflowValidator>()
@ -216,7 +219,6 @@ public class WorkflowManagementFeature : FeatureBase
.AddScoped<IWorkflowMaterializer, ClrWorkflowMaterializer>()
.AddScoped<IWorkflowMaterializer, JsonWorkflowMaterializer>()
.AddScoped<IActivityResolver, WorkflowDefinitionActivityResolver>()
.AddActivityProvider<WorkflowDefinitionActivityProvider>()
.AddScoped<WorkflowDefinitionMapper>()
.AddSingleton<VariableDefinitionMapper>()
.AddSingleton<WorkflowStateMapper>()

View file

@ -1,6 +1,7 @@
using Elsa.Mediator.Contracts;
using Elsa.Workflows.Contracts;
using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity;
using Elsa.Workflows.Management.Contracts;
using Elsa.Workflows.Management.Entities;
using Elsa.Workflows.Management.Notifications;
using JetBrains.Annotations;
@ -11,7 +12,7 @@ namespace Elsa.Workflows.Management.Handlers;
/// Refreshes the <see cref="IActivityRegistry"/> for the <see cref="WorkflowDefinitionActivityProvider"/> provider whenever an <see cref="WorkflowDefinition"/> is published, retracted or deleted.
/// </summary>
[PublicAPI]
public class RefreshActivityRegistry(IActivityRegistryUpdateService activityRegistryUpdateService) :
public class RefreshActivityRegistry(IWorkflowDefinitionActivityRegistryUpdater workflowDefinitionActivityRegistryUpdater) :
INotificationHandler<WorkflowDefinitionPublished>,
INotificationHandler<WorkflowDefinitionRetracted>,
INotificationHandler<WorkflowDefinitionDeleted>,
@ -30,14 +31,14 @@ public class RefreshActivityRegistry(IActivityRegistryUpdateService activityRegi
/// <inheritdoc />
public Task HandleAsync(WorkflowDefinitionRetracted notification, CancellationToken cancellationToken)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.WorkflowDefinition.Id, cancellationToken);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(notification.WorkflowDefinition.Id);
return Task.CompletedTask;
}
/// <inheritdoc />
public Task HandleAsync(WorkflowDefinitionDeleted notification, CancellationToken cancellationToken)
{
activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.DefinitionId, cancellationToken);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionFromRegistry(notification.DefinitionId);
return Task.CompletedTask;
}
@ -46,7 +47,7 @@ public class RefreshActivityRegistry(IActivityRegistryUpdateService activityRegi
{
foreach (string id in notification.DefinitionIds)
{
activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id, cancellationToken);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionFromRegistry(id);
}
return Task.CompletedTask;
@ -61,7 +62,7 @@ public class RefreshActivityRegistry(IActivityRegistryUpdateService activityRegi
/// <inheritdoc />
public Task HandleAsync(WorkflowDefinitionVersionDeleted notification, CancellationToken cancellationToken)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.WorkflowDefinition.Id, cancellationToken);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(notification.WorkflowDefinition.Id);
return Task.CompletedTask;
}
@ -70,7 +71,7 @@ public class RefreshActivityRegistry(IActivityRegistryUpdateService activityRegi
{
foreach (string id in notification.Ids)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id, cancellationToken);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(id);
}
return Task.CompletedTask;
@ -88,9 +89,9 @@ public class RefreshActivityRegistry(IActivityRegistryUpdateService activityRegi
private Task UpdateDefinition(string id, bool? usableAsActivity)
{
if (usableAsActivity.GetValueOrDefault())
return activityRegistryUpdateService.AddToRegistry(typeof(WorkflowDefinitionActivityProvider), id);
return workflowDefinitionActivityRegistryUpdater.AddToRegistry(id);
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(id);
return Task.CompletedTask;
}
}

View file

@ -1,17 +1,20 @@
using Elsa.Workflows.Contracts;
using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity;
using Elsa.Workflows.Management.Contracts;
using Elsa.Workflows.Models;
namespace Elsa.Workflows.Services;
namespace Elsa.Workflows.Management.Services;
/// <summary>
/// Service responsible for updating the activity registry based on activity providers.
/// </summary>
public class ActivityRegistryUpdateService(IEnumerable<IActivityProvider> providers, IActivityRegistry registry) : IActivityRegistryUpdateService
public class WorkflowDefinitionActivityRegistryUpdater(WorkflowDefinitionActivityProvider provider, IActivityRegistry registry) : IWorkflowDefinitionActivityRegistryUpdater
{
private readonly Type _providerType = typeof(WorkflowDefinitionActivityProvider);
/// <inheritdoc />
public async Task AddToRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default)
public async Task AddToRegistry(string workflowDefinitionVersionId, CancellationToken cancellationToken)
{
var provider = providers.First(x => x.GetType() == providerType);
var descriptors = await provider.GetDescriptorsAsync(cancellationToken);
var descriptorToAdd = descriptors
.SingleOrDefault(d =>
@ -19,13 +22,13 @@ public class ActivityRegistryUpdateService(IEnumerable<IActivityProvider> provid
val.ToString() == workflowDefinitionVersionId);
if (descriptorToAdd is not null)
registry.Add(providerType, descriptorToAdd);
registry.Add(_providerType, descriptorToAdd);
}
/// <inheritdoc />
public void RemoveDefinitionFromRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default)
public void RemoveDefinitionFromRegistry(string workflowDefinitionId)
{
var providerDescriptors = registry.ListByProvider(providerType);
var providerDescriptors = registry.ListByProvider(_providerType);
var descriptorsToRemove = providerDescriptors
.Where(d =>
@ -34,14 +37,14 @@ public class ActivityRegistryUpdateService(IEnumerable<IActivityProvider> provid
foreach (ActivityDescriptor activityDescriptor in descriptorsToRemove)
{
registry.Remove(providerType, activityDescriptor);
registry.Remove(_providerType, activityDescriptor);
}
}
/// <inheritdoc />
public void RemoveDefinitionVersionFromRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default)
public void RemoveDefinitionVersionFromRegistry(string workflowDefinitionVersionId)
{
var providerDescriptors = registry.ListByProvider(providerType);
var providerDescriptors = registry.ListByProvider(_providerType);
var descriptorToRemove = providerDescriptors
.SingleOrDefault(d =>
@ -49,6 +52,6 @@ public class ActivityRegistryUpdateService(IEnumerable<IActivityProvider> provid
val.ToString() == workflowDefinitionVersionId);
if (descriptorToRemove is not null)
registry.Remove(providerType, descriptorToRemove);
registry.Remove(_providerType, descriptorToRemove);
}
}