@@ -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}
0 commit comments