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:
parent
25d9608b25
commit
aef5921979
|
|
@ -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!;
|
||||
}
|
||||
|
|
@ -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 />
|
||||
|
|
|
|||
Loading…
Reference in a new issue