Skip to content

Commit e586594

Browse files
committed
Removing usages of obsolete RegisterProcess method calls
1 parent 3665f73 commit e586594

File tree

2 files changed

+74
-17
lines changed

2 files changed

+74
-17
lines changed

Src/NHibernate.Envers/Synchronization/AuditProcessManager.cs

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using System;
22
using System.Collections.Concurrent;
33
using System.Collections.Generic;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using NHibernate.Action;
47
using NHibernate.Envers.RevisionInfo;
58
using NHibernate.Event;
69

@@ -27,18 +30,49 @@ public AuditProcess Get(IEventSource session)
2730
// No worries about registering a transaction twice - a transaction is single thread
2831
auditProcess = new AuditProcess(_revisionInfoGenerator, session);
2932
_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);
3936
}
4037

4138
return auditProcess;
4239
}
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+
}
4377
}
4478
}

Src/NHibernate.Envers/Synchronization/SessionCacheCleaner.cs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using NHibernate.Event;
1+
using System.Threading;
2+
using System.Threading.Tasks;
3+
using NHibernate.Action;
4+
using NHibernate.Event;
25

36
namespace NHibernate.Envers.Synchronization
47
{
@@ -16,13 +19,33 @@ public static class SessionCacheCleaner
1619
/// <param name="data">Audit data that shall be evicted (e.g. revision data or entity snapshot)</param>
1720
public static void ScheduleAuditDataRemoval(ISession session, object data)
1821
{
19-
((IEventSource)session).ActionQueue.RegisterProcess(success =>
20-
{
21-
if(session.IsOpen)
22-
{
23-
session.Evict(data);
24-
}
25-
});
22+
((IEventSource)session).ActionQueue.RegisterProcess(new cleanupAfterTranProcess(session, data));
23+
}
24+
25+
private class cleanupAfterTranProcess : IAfterTransactionCompletionProcess
26+
{
27+
private readonly ISession _session;
28+
private readonly object _data;
29+
30+
public cleanupAfterTranProcess(ISession session, object data)
31+
{
32+
_session = session;
33+
_data = data;
34+
}
35+
36+
public void ExecuteAfterTransactionCompletion(bool success)
37+
{
38+
if(_session.IsOpen)
39+
{
40+
_session.Evict(_data);
41+
}
42+
}
43+
44+
public Task ExecuteAfterTransactionCompletionAsync(bool success, CancellationToken cancellationToken)
45+
{
46+
ExecuteAfterTransactionCompletion(success);
47+
return Task.CompletedTask;
48+
}
2649
}
2750
}
2851
}

0 commit comments

Comments
 (0)