Skip to content

Commit 8c84e2c

Browse files
DominicUllmannfredericDelaporte
authored andcommitted
Make NHibernateUtil.Initialize / IsInitialized better reusable
- inferred ILazyInitializedCollection from IPersistentCollection - changed NHibernateUtil.Initialize / IsInitialized to handle ILazyInitializedCollection
1 parent 03d5aee commit 8c84e2c

File tree

8 files changed

+173
-6
lines changed

8 files changed

+173
-6
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using NHibernate.Collection;
12+
using NSubstitute;
13+
using NUnit.Framework;
14+
15+
namespace NHibernate.Test.NHSpecificTest.GH1515
16+
{
17+
using System.Threading.Tasks;
18+
using System.Threading;
19+
[TestFixture]
20+
public class FixtureAsync
21+
{
22+
23+
[Test]
24+
public async Task IntializeForwaredToLazyCollectionAsync()
25+
{
26+
var collection = Substitute.For<ILazyInitializedCollection>();
27+
28+
await (NHibernateUtil.InitializeAsync(collection));
29+
30+
await (collection.Received().ForceInitializationAsync(CancellationToken.None));
31+
}
32+
33+
[Test]
34+
public async Task IntializeForwaredToPersistentCollectionAsync()
35+
{
36+
var collection = Substitute.For<IPersistentCollection>();
37+
38+
await (NHibernateUtil.InitializeAsync(collection));
39+
40+
await (collection.Received().ForceInitializationAsync(CancellationToken.None));
41+
}
42+
43+
44+
}
45+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using NHibernate.Collection;
2+
using NSubstitute;
3+
using NUnit.Framework;
4+
5+
namespace NHibernate.Test.NHSpecificTest.GH1515
6+
{
7+
[TestFixture]
8+
public class Fixture
9+
{
10+
[Test]
11+
public void IsInitializedCallsWasInitializedFromLazyCollection()
12+
{
13+
var collection = Substitute.For<ILazyInitializedCollection>();
14+
15+
NHibernateUtil.IsInitialized(collection);
16+
17+
var assertRes = collection.Received().WasInitialized;
18+
}
19+
20+
[Test]
21+
public void IntializeForwaredToLazyCollection()
22+
{
23+
var collection = Substitute.For<ILazyInitializedCollection>();
24+
25+
NHibernateUtil.Initialize(collection);
26+
27+
collection.Received().ForceInitialization();
28+
}
29+
30+
[Test]
31+
public void IsInitializedCallsWasInitializedFromPersistentCollection()
32+
{
33+
var collection = Substitute.For<IPersistentCollection>();
34+
35+
NHibernateUtil.IsInitialized(collection);
36+
37+
var assertRes = collection.Received().WasInitialized;
38+
}
39+
40+
[Test]
41+
public void IntializeForwaredToPersistentCollection()
42+
{
43+
var collection = Substitute.For<IPersistentCollection>();
44+
45+
NHibernateUtil.Initialize(collection);
46+
47+
collection.Received().ForceInitialization();
48+
}
49+
50+
51+
}
52+
}

src/NHibernate/Async/Collection/AbstractPersistentCollection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace NHibernate.Collection
2424
{
2525
using System.Threading.Tasks;
2626
using System.Threading;
27-
public abstract partial class AbstractPersistentCollection : IPersistentCollection
27+
public abstract partial class AbstractPersistentCollection : IPersistentCollection, ILazyInitializedCollection
2828
{
2929

3030
/// <summary>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
namespace NHibernate.Collection
12+
{
13+
using System.Threading.Tasks;
14+
using System.Threading;
15+
public partial interface ILazyInitializedCollection
16+
{
17+
18+
/// <summary>
19+
/// Force immediate initialization.
20+
/// </summary>
21+
/// <param name="cancellationToken">A cancellation token that can be used to cancel the work</param>
22+
Task ForceInitializationAsync(CancellationToken cancellationToken);
23+
24+
}
25+
}

src/NHibernate/Async/NHibernateUtil.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,17 @@ public static partial class NHibernateUtil
4848
{
4949
return ((INHibernateProxy)proxy).HibernateLazyInitializer.InitializeAsync(cancellationToken);
5050
}
51-
else if (proxy is IPersistentCollection coll)
51+
else if (proxy is ILazyInitializedCollection coll)
5252
{
5353
return coll.ForceInitializationAsync(cancellationToken);
5454
}
55+
// 6.0 TODO: remove once IPersistentCollection derives from ILazyInitializedCollection
56+
else if (proxy is IPersistentCollection persistent)
57+
{
58+
return persistent.ForceInitializationAsync(cancellationToken);
59+
}
5560
return Task.CompletedTask;
61+
5662
}
5763
catch (Exception ex)
5864
{

src/NHibernate/Collection/AbstractPersistentCollection.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ namespace NHibernate.Collection
1515
/// <summary>
1616
/// Base class for implementing <see cref="IPersistentCollection"/>.
1717
/// </summary>
18+
// 6.0 TODO: remove ILazyInitializedCollection once IPersistentCollection derives from it
1819
[Serializable]
19-
public abstract partial class AbstractPersistentCollection : IPersistentCollection
20+
public abstract partial class AbstractPersistentCollection : IPersistentCollection, ILazyInitializedCollection
2021
{
2122
protected internal static readonly object Unknown = new object(); //place holder
2223
protected internal static readonly object NotFound = new object(); //place holder
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
namespace NHibernate.Collection
2+
{
3+
/// <summary>
4+
/// This interface allows to check if a lazy collection is already initialized and to force its initialization.
5+
/// </summary>
6+
/// <remarks>
7+
/// This interface is provided to allow implementing lazy initialized collections which do not implement
8+
/// <see cref="IPersistentCollection" />.
9+
/// That is e.g. needed for NHibernate.Envers which can't load its collections as PersistentCollections.
10+
/// </remarks>
11+
// 6.0 TODO: set as ancestor of IPersistentCollection
12+
public partial interface ILazyInitializedCollection
13+
{
14+
/// <summary>
15+
/// Return <see langword="true"/> if the proxy has already been initialized.
16+
/// If <see langword="false"/>, accessing the collection or calling <see cref="ForceInitialization" />
17+
/// initializes the collection.
18+
/// </summary>
19+
bool WasInitialized { get; }
20+
21+
/// <summary>
22+
/// Force immediate initialization.
23+
/// </summary>
24+
void ForceInitialization();
25+
26+
}
27+
}

src/NHibernate/NHibernateUtil.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -382,10 +382,16 @@ public static void Initialize(object proxy)
382382
{
383383
((INHibernateProxy)proxy).HibernateLazyInitializer.Initialize();
384384
}
385-
else if (proxy is IPersistentCollection coll)
385+
else if (proxy is ILazyInitializedCollection coll)
386386
{
387387
coll.ForceInitialization();
388388
}
389+
// 6.0 TODO: remove once IPersistentCollection derives from ILazyInitializedCollection
390+
else if (proxy is IPersistentCollection persistent)
391+
{
392+
persistent.ForceInitialization();
393+
}
394+
389395
}
390396

391397
/// <summary>
@@ -399,9 +405,14 @@ public static bool IsInitialized(object proxy)
399405
{
400406
return !((INHibernateProxy)proxy).HibernateLazyInitializer.IsUninitialized;
401407
}
402-
else if (proxy is IPersistentCollection)
408+
else if (proxy is ILazyInitializedCollection coll)
409+
{
410+
return coll.WasInitialized;
411+
}
412+
// 6.0 TODO: remove once IPersistentCollection derives from ILazyInitializedCollection
413+
else if (proxy is IPersistentCollection persistent)
403414
{
404-
return ((IPersistentCollection)proxy).WasInitialized;
415+
return persistent.WasInitialized;
405416
}
406417
else
407418
{

0 commit comments

Comments
 (0)