56 lines
1.6 KiB
C#
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;
|
|
}
|
|
}
|