1
1
using System ;
2
2
using System . Collections . Concurrent ;
3
3
using System . Collections . Generic ;
4
+ using System . Threading ;
5
+ using System . Threading . Tasks ;
6
+ using NHibernate . Action ;
4
7
using NHibernate . Envers . RevisionInfo ;
5
8
using NHibernate . Event ;
6
9
@@ -27,18 +30,49 @@ public AuditProcess Get(IEventSource session)
27
30
// No worries about registering a transaction twice - a transaction is single thread
28
31
auditProcess = new AuditProcess ( _revisionInfoGenerator , session ) ;
29
32
_auditProcesses [ transaction ] = auditProcess ;
30
-
31
- session . ActionQueue . RegisterProcess ( ( ) =>
32
- {
33
- if ( _auditProcesses . TryGetValue ( transaction , out var currentProcess ) )
34
- {
35
- currentProcess . DoBeforeTransactionCompletion ( ) ;
36
- }
37
- } ) ;
38
- session . ActionQueue . RegisterProcess ( success => _auditProcesses . Remove ( transaction ) ) ;
33
+ var tranProcess = new transactionCompletionProcess ( _auditProcesses , transaction ) ;
34
+ session . ActionQueue . RegisterProcess ( ( IBeforeTransactionCompletionProcess ) tranProcess ) ;
35
+ session . ActionQueue . RegisterProcess ( ( IAfterTransactionCompletionProcess ) tranProcess ) ;
39
36
}
40
37
41
38
return auditProcess ;
42
39
}
40
+
41
+ private class transactionCompletionProcess : IBeforeTransactionCompletionProcess , IAfterTransactionCompletionProcess
42
+ {
43
+ private readonly IDictionary < ITransaction , AuditProcess > _auditProcesses ;
44
+ private readonly ITransaction _transaction ;
45
+
46
+ public transactionCompletionProcess ( IDictionary < ITransaction , AuditProcess > auditProcesses , ITransaction transaction )
47
+ {
48
+ _auditProcesses = auditProcesses ;
49
+ _transaction = transaction ;
50
+ }
51
+
52
+ public void ExecuteBeforeTransactionCompletion ( )
53
+ {
54
+ if ( _auditProcesses . TryGetValue ( _transaction , out var currentProcess ) )
55
+ {
56
+ currentProcess . DoBeforeTransactionCompletion ( ) ;
57
+ }
58
+ }
59
+
60
+ public void ExecuteAfterTransactionCompletion ( bool success )
61
+ {
62
+ _auditProcesses . Remove ( _transaction ) ;
63
+ }
64
+
65
+ public Task ExecuteBeforeTransactionCompletionAsync ( CancellationToken cancellationToken )
66
+ {
67
+ ExecuteBeforeTransactionCompletion ( ) ;
68
+ return Task . CompletedTask ;
69
+ }
70
+
71
+ public Task ExecuteAfterTransactionCompletionAsync ( bool success , CancellationToken cancellationToken )
72
+ {
73
+ ExecuteAfterTransactionCompletion ( success ) ;
74
+ return Task . CompletedTask ;
75
+ }
76
+ }
43
77
}
44
78
}
0 commit comments