dotnet-cqrs/Svrnty.CQRS.Events/Sagas/SagaRegistry.cs

56 lines
1.6 KiB
C#

using System;
using System.Collections.Concurrent;
using Svrnty.CQRS.Events.Abstractions.Sagas;
namespace Svrnty.CQRS.Events.Sagas;
/// <summary>
/// In-memory registry for saga definitions.
/// </summary>
public sealed class SagaRegistry : ISagaRegistry
{
private readonly ConcurrentDictionary<Type, SagaDefinition> _definitionsByType = new();
private readonly ConcurrentDictionary<string, SagaDefinition> _definitionsByName = new();
private readonly ConcurrentDictionary<string, Type> _typesByName = new();
/// <inheritdoc />
public void Register<TSaga>(SagaDefinition definition) where TSaga : ISaga
{
if (definition == null)
throw new ArgumentNullException(nameof(definition));
var sagaType = typeof(TSaga);
_definitionsByType[sagaType] = definition;
_definitionsByName[definition.SagaName] = definition;
_typesByName[definition.SagaName] = sagaType;
}
/// <inheritdoc />
public SagaDefinition? GetDefinition<TSaga>() where TSaga : ISaga
{
_definitionsByType.TryGetValue(typeof(TSaga), out var definition);
return definition;
}
/// <inheritdoc />
public SagaDefinition? GetDefinitionByName(string sagaName)
{
if (string.IsNullOrWhiteSpace(sagaName))
return null;
_definitionsByName.TryGetValue(sagaName, out var definition);
return definition;
}
/// <inheritdoc />
public Type? GetSagaType(string sagaName)
{
if (string.IsNullOrWhiteSpace(sagaName))
return null;
_typesByName.TryGetValue(sagaName, out var type);
return type;
}
}