Refactor reference handling in serialization classes

Replaces static resolver state with an instance-level resolver in `CrossScopedReferenceHandler` to enhance flexibility and thread-safety. Refactors `JsonWorkflowStateSerializer` to use `GetOptions` for improved API consistency and clarity.
This commit is contained in:
Sipke Schoorstra 2025-01-06 18:11:11 +01:00
parent 25d9608b25
commit aef5921979
2 changed files with 18 additions and 16 deletions

View file

@ -7,23 +7,21 @@ namespace Elsa.Workflows.Serialization.ReferenceHandlers;
/// </summary>
public class CrossScopedReferenceHandler : ReferenceHandler
{
private static readonly AsyncLocal<CustomPreserveReferenceResolver> RootedResolverState = new();
private CustomPreserveReferenceResolver RootedResolver
{
get
{
RootedResolverState.Value ??= new CustomPreserveReferenceResolver();
return RootedResolverState.Value!;
}
}
/// <inheritdoc />
public CrossScopedReferenceHandler() => Reset();
private ReferenceResolver? _rootedResolver;
/// <inheritdoc />
public override ReferenceResolver CreateResolver() => RootedResolver;
public override ReferenceResolver CreateResolver() => _rootedResolver!;
/// <summary>
/// Resets the reference resolver.
/// </summary>
public void Reset() => _rootedResolver = new CustomPreserveReferenceResolver();
/// <summary>
/// Gets the reference resolver.
/// </summary>
/// <returns>The reference resolver.</returns>
public ReferenceResolver GetResolver() => RootedResolver;
public ReferenceResolver GetResolver() => _rootedResolver!;
}

View file

@ -124,10 +124,14 @@ public class JsonWorkflowStateSerializer : ConfigurableSerializer, IWorkflowStat
return JsonSerializer.Deserialize<T>(serializedState, options)!;
}
public override void ApplyOptions(JsonSerializerOptions options)
/// <inheritdoc />
public override JsonSerializerOptions GetOptions()
{
base.ApplyOptions(options);
options.ReferenceHandler = new CrossScopedReferenceHandler();
var options = base.GetOptions();
return new JsonSerializerOptions(options)
{
ReferenceHandler = new CrossScopedReferenceHandler()
};
}
/// <inheritdoc />