Skip to content

Commit 0ca4723

Browse files
authored
Merge pull request #804 from danielgerlag/fix-registry
Fix registry
2 parents 07243cd + 0c9085c commit 0ca4723

File tree

3 files changed

+45
-34
lines changed

3 files changed

+45
-34
lines changed

src/WorkflowCore/Services/WorkflowRegistry.cs

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ namespace WorkflowCore.Services
1010
{
1111
public class WorkflowRegistry : IWorkflowRegistry
1212
{
13-
private readonly IServiceProvider _serviceProvider;
14-
private readonly BlockingCollection<(string workflowId, int version, WorkflowDefinition definition)> _registry = new BlockingCollection<(string, int, WorkflowDefinition)>();
13+
private readonly IServiceProvider _serviceProvider;
14+
private readonly ConcurrentDictionary<string, WorkflowDefinition> _registry = new ConcurrentDictionary<string, WorkflowDefinition>();
15+
private readonly ConcurrentDictionary<string, WorkflowDefinition> _lastestVersion = new ConcurrentDictionary<string, WorkflowDefinition>();
1516

1617
public WorkflowRegistry(IServiceProvider serviceProvider)
1718
{
@@ -20,75 +21,85 @@ public WorkflowRegistry(IServiceProvider serviceProvider)
2021

2122
public WorkflowDefinition GetDefinition(string workflowId, int? version = null)
2223
{
23-
(string workflowId, int version, WorkflowDefinition definition) workflowEntry;
2424
if (version.HasValue)
2525
{
26-
workflowEntry = _registry.FirstOrDefault(x => x.workflowId == workflowId && x.version == version.Value);
26+
if (!_registry.ContainsKey($"{workflowId}-{version}"))
27+
return default;
28+
return _registry[$"{workflowId}-{version}"];
2729
}
2830
else
2931
{
30-
workflowEntry = _registry.Where(x => x.workflowId == workflowId).OrderByDescending(x => x.version)
31-
.FirstOrDefault();
32+
if (!_lastestVersion.ContainsKey(workflowId))
33+
return default;
34+
return _lastestVersion[workflowId];
3235
}
33-
34-
return workflowEntry != default ? workflowEntry.definition : default;
3536
}
3637

3738
public void DeregisterWorkflow(string workflowId, int version)
3839
{
39-
var definition = _registry.FirstOrDefault(x => x.workflowId == workflowId && x.version == version);
40-
if (definition != default)
40+
if (!_registry.ContainsKey($"{workflowId}-{version}"))
41+
return;
42+
43+
lock (_registry)
4144
{
42-
_registry.TryTake(out definition);
45+
_registry.TryRemove($"{workflowId}-{version}", out var _);
46+
if (_lastestVersion[workflowId].Version == version)
47+
{
48+
_lastestVersion.TryRemove(workflowId, out var _);
49+
50+
var latest = _registry.Values.Where(x => x.Id == workflowId).OrderByDescending(x => x.Version).FirstOrDefault();
51+
if (latest != default)
52+
_lastestVersion[workflowId] = latest;
53+
}
4354
}
4455
}
4556

4657
public void RegisterWorkflow(IWorkflow workflow)
4758
{
48-
if (_registry.Any(x => x.workflowId == workflow.Id && x.version == workflow.Version))
49-
{
50-
throw new InvalidOperationException($"Workflow {workflow.Id} version {workflow.Version} is already registered");
51-
}
52-
5359
var builder = _serviceProvider.GetService<IWorkflowBuilder>().UseData<object>();
5460
workflow.Build(builder);
5561
var def = builder.Build(workflow.Id, workflow.Version);
56-
_registry.Add((workflow.Id, workflow.Version, def));
62+
RegisterWorkflow(def);
5763
}
5864

5965
public void RegisterWorkflow(WorkflowDefinition definition)
6066
{
61-
if (_registry.Any(x => x.workflowId == definition.Id && x.version == definition.Version))
67+
if (_registry.ContainsKey($"{definition.Id}-{definition.Version}"))
6268
{
6369
throw new InvalidOperationException($"Workflow {definition.Id} version {definition.Version} is already registered");
6470
}
6571

66-
_registry.Add((definition.Id, definition.Version, definition));
72+
lock (_registry)
73+
{
74+
_registry[$"{definition.Id}-{definition.Version}"] = definition;
75+
if (!_lastestVersion.ContainsKey(definition.Id))
76+
{
77+
_lastestVersion[definition.Id] = definition;
78+
return;
79+
}
80+
81+
if (_lastestVersion[definition.Id].Version <= definition.Version)
82+
_lastestVersion[definition.Id] = definition;
83+
}
6784
}
6885

6986
public void RegisterWorkflow<TData>(IWorkflow<TData> workflow)
7087
where TData : new()
7188
{
72-
if (_registry.Any(x => x.workflowId == workflow.Id && x.version == workflow.Version))
73-
{
74-
throw new InvalidOperationException($"Workflow {workflow.Id} version {workflow.Version} is already registered");
75-
}
76-
7789
var builder = _serviceProvider.GetService<IWorkflowBuilder>().UseData<TData>();
7890
workflow.Build(builder);
7991
var def = builder.Build(workflow.Id, workflow.Version);
80-
_registry.Add((workflow.Id, workflow.Version, def));
92+
RegisterWorkflow(def);
8193
}
8294

8395
public bool IsRegistered(string workflowId, int version)
8496
{
85-
var definition = _registry.FirstOrDefault(x => x.workflowId == workflowId && x.version == version);
86-
return definition != default;
97+
return _registry.ContainsKey($"{workflowId}-{version}");
8798
}
8899

89100
public IEnumerable<WorkflowDefinition> GetAllDefinitions()
90101
{
91-
return _registry.Select(i => i.definition);
102+
return _registry.Values;
92103
}
93104
}
94105
}

src/WorkflowCore/WorkflowCore.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
1616
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
1717
<Description>Workflow Core is a light weight workflow engine targeting .NET Standard.</Description>
18-
<Version>3.3.5</Version>
19-
<AssemblyVersion>3.3.5.0</AssemblyVersion>
20-
<FileVersion>3.3.5.0</FileVersion>
18+
<Version>3.3.6</Version>
19+
<AssemblyVersion>3.3.6.0</AssemblyVersion>
20+
<FileVersion>3.3.6.0</FileVersion>
2121
<PackageReleaseNotes></PackageReleaseNotes>
2222
<PackageIconUrl>https://github.com/danielgerlag/workflow-core/raw/master/src/logo.png</PackageIconUrl>
23-
<PackageVersion>3.3.5</PackageVersion>
23+
<PackageVersion>3.3.6</PackageVersion>
2424
</PropertyGroup>
2525

2626
<ItemGroup>

src/samples/WorkflowCore.TestSample01/NUnitTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ namespace WorkflowCore.TestSample01
1111
public class NUnitTest : WorkflowTest<MyWorkflow, MyDataClass>
1212
{
1313
[SetUp]
14-
protected override void Setup(bool registerClassMap = false)
14+
protected void Setup()
1515
{
16-
base.Setup(registerClassMap);
16+
base.Setup(false);
1717
}
1818

1919
[Test]

0 commit comments

Comments
 (0)