Skip to content

Commit 8666d48

Browse files
committed
Refactor IBefore/AfterTransactionCompletionProcess to avoid delegates
1 parent a592363 commit 8666d48

19 files changed

+148
-283
lines changed

src/AsyncGenerator.yml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,6 @@
9595
- conversion: Ignore
9696
name: Exists
9797
containingTypeName: AbstractCollectionPersister
98-
- conversion: ToAsync
99-
rule: TransactionCompletion
10098
- conversion: Ignore
10199
name: QuoteTableAndColumns
102100
containingTypeName: SchemaMetadataUpdater
@@ -116,6 +114,8 @@
116114
rule: EventListener
117115
- conversion: ToAsync
118116
rule: Cache
117+
- conversion: ToAsync
118+
rule: TransactionCompletion
119119
typeConversion:
120120
- conversion: Ignore
121121
name: EnumerableImpl
@@ -281,11 +281,9 @@ methodRules:
281281
name: Cache
282282
- filters:
283283
- containingType: NHibernate.Action.IAfterTransactionCompletionProcess
284-
name: Execute
285284
- containingType: NHibernate.Action.IBeforeTransactionCompletionProcess
286-
name: Execute
287285
- containingType: NHibernate.Action.EntityAction
288-
name: BeforeTransactionCompletionProcessImpl
286+
name: BeforeTransactionCompletionProcessImpl
289287
name: TransactionCompletion
290288
- filters:
291289
- containingNamespace: NHibernate

src/NHibernate.Test/BulkManipulation/BulkOperationCleanupActionFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void AfterTransactionCompletionProcess_EvictsFromCache(string querySpaces
4545

4646
var target = new BulkOperationCleanupAction(_session, new HashSet<string>(querySpaces.Split(new []{','},StringSplitOptions.RemoveEmptyEntries)));
4747

48-
target.AfterTransactionCompletionProcess(true);
48+
target.AfterTransactionCompletionProcess.ExecuteAfterTransactionCompletion(true);
4949

5050
Assert.AreEqual(expectedPropertySpaceLength, target.PropertySpaces.Length);
5151

src/NHibernate/Action/AfterTransactionCompletionProcess.cs

Lines changed: 0 additions & 50 deletions
This file was deleted.

src/NHibernate/Action/BeforeTransactionCompletionProcess.cs

Lines changed: 0 additions & 49 deletions
This file was deleted.

src/NHibernate/Action/BulkOperationCleanupAction.cs

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace NHibernate.Action
1414
/// Implementation of BulkOperationCleanupAction.
1515
/// </summary>
1616
[Serializable]
17-
public partial class BulkOperationCleanupAction : IExecutable
17+
public partial class BulkOperationCleanupAction : IExecutable, IAfterTransactionCompletionProcess
1818
{
1919
private readonly ISessionImplementor session;
2020
private readonly HashSet<string> affectedEntityNames = new HashSet<string>();
@@ -109,31 +109,14 @@ public void Execute()
109109
// nothing to do
110110
}
111111

112-
public IBeforeTransactionCompletionProcess BeforeTransactionCompletionProcess
113-
{
114-
get
115-
{
116-
return null;
117-
}
118-
}
112+
public IBeforeTransactionCompletionProcess BeforeTransactionCompletionProcess => null;
113+
114+
public IAfterTransactionCompletionProcess AfterTransactionCompletionProcess => this;
119115

120-
public IAfterTransactionCompletionProcess AfterTransactionCompletionProcess
116+
public void ExecuteAfterTransactionCompletion(bool success)
121117
{
122-
get
123-
{
124-
return new AfterTransactionCompletionProcess(
125-
(success) =>
126-
{
127-
EvictEntityRegions();
128-
EvictCollectionRegions();
129-
},
130-
async (success, cancellationToken) =>
131-
{
132-
await EvictEntityRegionsAsync(cancellationToken);
133-
await EvictCollectionRegionsAsync(cancellationToken);
134-
}
135-
);
136-
}
118+
EvictEntityRegions();
119+
EvictCollectionRegions();
137120
}
138121

139122
private void EvictCollectionRegions()

src/NHibernate/Action/CollectionAction.cs

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace NHibernate.Action
1414
/// Any action relating to insert/update/delete of a collection
1515
/// </summary>
1616
[Serializable]
17-
public abstract partial class CollectionAction : IExecutable, IComparable<CollectionAction>, IDeserializationCallback
17+
public abstract partial class CollectionAction : IExecutable, IComparable<CollectionAction>, IDeserializationCallback, IAfterTransactionCompletionProcess
1818
{
1919
private readonly object key;
2020
private object finalKey;
@@ -104,39 +104,17 @@ public virtual void BeforeExecutions()
104104
/// <summary>Execute this action</summary>
105105
public abstract void Execute();
106106

107-
public virtual IBeforeTransactionCompletionProcess BeforeTransactionCompletionProcess
108-
{
109-
get
110-
{
111-
return null;
112-
}
113-
}
107+
public virtual IBeforeTransactionCompletionProcess BeforeTransactionCompletionProcess => null;
114108

115-
public virtual IAfterTransactionCompletionProcess AfterTransactionCompletionProcess
116-
{
109+
// Only make sense to add the delegate if there is a cache.
110+
public virtual IAfterTransactionCompletionProcess AfterTransactionCompletionProcess => persister.HasCache ? this : null;
117111

118-
get
119-
{
120-
// Only make sense to add the delegate if there is a cache.
121-
if (persister.HasCache)
122-
{
123-
return new AfterTransactionCompletionProcess(
124-
(success) =>
125-
{
126-
var ck = new CacheKey(key, persister.KeyType, persister.Role, Session.Factory);
127-
persister.Cache.Release(ck, softLock);
128-
},
129-
async (success, cancellationToken) =>
130-
{
131-
var ck = new CacheKey(key, persister.KeyType, persister.Role, Session.Factory);
132-
await persister.Cache.ReleaseAsync(ck, softLock, cancellationToken).ConfigureAwait(false);
133-
}
134-
);
135-
}
136-
return null;
137-
}
112+
public virtual void ExecuteAfterTransactionCompletion(bool success)
113+
{
114+
var ck = new CacheKey(key, persister.KeyType, persister.Role, Session.Factory);
115+
persister.Cache.Release(ck, softLock);
138116
}
139-
117+
140118
#endregion
141119

142120
public ISoftLock Lock

src/NHibernate/Action/CollectionUpdateAction.cs

Lines changed: 15 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace NHibernate.Action
1313
{
1414
[Serializable]
15-
public sealed partial class CollectionUpdateAction : CollectionAction
15+
public sealed partial class CollectionUpdateAction : CollectionAction, IAfterTransactionCompletionProcess
1616
{
1717
private readonly bool emptySnapshot;
1818

@@ -114,65 +114,28 @@ private void PostUpdate()
114114
}
115115
}
116116

117-
public override IBeforeTransactionCompletionProcess BeforeTransactionCompletionProcess
117+
public override void ExecuteAfterTransactionCompletion(bool success)
118118
{
119-
get
120-
{
121-
return null;
122-
}
123-
}
119+
CacheKey ck = Session.GenerateCacheKey(Key, Persister.KeyType, Persister.Role);
124120

125-
public override IAfterTransactionCompletionProcess AfterTransactionCompletionProcess
126-
{
127-
get
121+
if (success)
128122
{
129-
// Only make sense to add the delegate if there is a cache.
130-
if (Persister.HasCache)
123+
// we can't disassemble a collection if it was uninitialized
124+
// or detached from the session
125+
if (Collection.WasInitialized && Session.PersistenceContext.ContainsCollection(Collection))
131126
{
132-
return new CollectionCacheUpdate(this);
133-
}
134-
return null;
135-
}
136-
}
127+
CollectionCacheEntry entry = CollectionCacheEntry.Create(Collection, Persister);
128+
bool put = Persister.Cache.AfterUpdate(ck, entry, null, Lock);
137129

138-
private partial class CollectionCacheUpdate : IAfterTransactionCompletionProcess
139-
{
140-
141-
private CollectionUpdateAction _action;
142-
143-
internal CollectionCacheUpdate(CollectionUpdateAction action)
144-
{
145-
_action = action;
146-
}
147-
148-
public void Execute(bool success)
149-
{
150-
var session = _action.Session;
151-
var persister = _action.Persister;
152-
var cacheLock = _action.Lock;
153-
CacheKey ck = session.GenerateCacheKey(_action.Key, persister.KeyType, persister.Role);
154-
155-
if (success)
156-
{
157-
var collection = _action.Collection;
158-
159-
// we can't disassemble a collection if it was uninitialized
160-
// or detached from the session
161-
if (collection.WasInitialized && session.PersistenceContext.ContainsCollection(collection))
130+
if (put && Session.Factory.Statistics.IsStatisticsEnabled)
162131
{
163-
CollectionCacheEntry entry = CollectionCacheEntry.Create(collection, persister);
164-
bool put = persister.Cache.AfterUpdate(ck, entry, null, cacheLock);
165-
166-
if (put && session.Factory.Statistics.IsStatisticsEnabled)
167-
{
168-
session.Factory.StatisticsImplementor.SecondLevelCachePut(persister.Cache.RegionName);
169-
}
132+
Session.Factory.StatisticsImplementor.SecondLevelCachePut(Persister.Cache.RegionName);
170133
}
171134
}
172-
else
173-
{
174-
persister.Cache.Release(ck, cacheLock);
175-
}
135+
}
136+
else
137+
{
138+
Persister.Cache.Release(ck, Lock);
176139
}
177140
}
178141
}

src/NHibernate/Action/EntityAction.cs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ namespace NHibernate.Action
1313
/// instance.
1414
/// </summary>
1515
[Serializable]
16-
public abstract partial class EntityAction : IExecutable, IComparable<EntityAction>, IDeserializationCallback
16+
public abstract partial class EntityAction : IExecutable, IComparable<EntityAction>, IDeserializationCallback,
17+
IBeforeTransactionCompletionProcess,
18+
IAfterTransactionCompletionProcess
1719
{
1820
private readonly string entityName;
1921
private readonly object id;
@@ -102,26 +104,12 @@ public void BeforeExecutions()
102104

103105
public abstract void Execute();
104106

105-
public virtual IBeforeTransactionCompletionProcess BeforeTransactionCompletionProcess
106-
{
107-
get
108-
{
109-
return NeedsBeforeTransactionCompletion()
110-
? new BeforeTransactionCompletionProcess(BeforeTransactionCompletionProcessImpl, BeforeTransactionCompletionProcessImplAsync)
111-
: null;
112-
}
113-
}
114-
115-
public virtual IAfterTransactionCompletionProcess AfterTransactionCompletionProcess
116-
{
117-
get
118-
{
119-
return NeedsAfterTransactionCompletion()
120-
? new AfterTransactionCompletionProcess(AfterTransactionCompletionProcessImpl, AfterTransactionCompletionProcessImplAsync)
121-
: null;
122-
}
123-
}
124-
107+
public virtual IBeforeTransactionCompletionProcess BeforeTransactionCompletionProcess =>
108+
NeedsBeforeTransactionCompletion() ? this : null;
109+
110+
public virtual IAfterTransactionCompletionProcess AfterTransactionCompletionProcess =>
111+
NeedsAfterTransactionCompletion() ? this : null;
112+
125113
protected virtual bool NeedsAfterTransactionCompletion()
126114
{
127115
return persister.HasCache || HasPostCommitEventListeners;
@@ -142,6 +130,16 @@ protected virtual void AfterTransactionCompletionProcessImpl(bool success)
142130
{
143131
}
144132

133+
public void ExecuteBeforeTransactionCompletion()
134+
{
135+
BeforeTransactionCompletionProcessImpl();
136+
}
137+
138+
public void ExecuteAfterTransactionCompletion(bool success)
139+
{
140+
AfterTransactionCompletionProcessImpl(success);
141+
}
142+
145143
#endregion
146144

147145
#region IComparable<EntityAction> Members

0 commit comments

Comments
 (0)