Skip to content

Commit 1cdfda8

Browse files
committed
feat(#75): Add QueueInitializeAsync to ManualDi.Async
Initialization was missing async queueing functionality
1 parent 1a0d9c2 commit 1cdfda8

2 files changed

Lines changed: 42 additions & 5 deletions

File tree

ManualDi.Async/ManualDi.Async.Tests/TestDiContainerBindings.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public async Task TestQueueInject()
3737
}
3838

3939
[Test]
40-
public async Task TestQueueInitialization()
40+
public async Task TestQueueInitialize()
4141
{
4242
var initializationDelegate = Substitute.For<ContainerDelegate>();
4343

@@ -48,6 +48,18 @@ public async Task TestQueueInitialization()
4848
initializationDelegate.Received(1).Invoke(Arg.Is<IDiContainer>(container));
4949
}
5050

51+
[Test]
52+
public async Task TestQueueInitializeAsync()
53+
{
54+
var initializationDelegate = Substitute.For<AsyncContainerDelegate>();
55+
56+
await using var container = await new DiContainerBindings()
57+
.Install(b => b.QueueInitializeAsync(initializationDelegate))
58+
.Build(CancellationToken.None);
59+
60+
await initializationDelegate.Received(1).Invoke(Arg.Is<IDiContainer>(container), Arg.Any<CancellationToken>());
61+
}
62+
5163
[Test]
5264
public async Task TestQueueStartup()
5365
{

ManualDi.Async/ManualDi.Async/Building/DiContainerBindings.cs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public sealed class DiContainerBindings
1212
{
1313
internal readonly Dictionary<IntPtr, Binding> bindingsByType;
1414
private readonly List<ContainerDelegate> injectDelegates;
15-
private readonly List<ContainerDelegate> initializeDelegates;
15+
private readonly List<object> initializeDelegates;
1616
private readonly List<object> startupDelegates;
1717
private readonly List<object> disposables;
1818

@@ -74,6 +74,11 @@ public void QueueInitialize(ContainerDelegate containerDelegate)
7474
initializeDelegates.Add(containerDelegate);
7575
}
7676

77+
public void QueueInitializeAsync(AsyncContainerDelegate asyncContainerDelegate)
78+
{
79+
initializeDelegates.Add(asyncContainerDelegate);
80+
}
81+
7782
[Obsolete("Use QueueInitialize instead")]
7883
public void QueueInitialization(ContainerDelegate containerDelegate)
7984
{
@@ -178,7 +183,17 @@ internal Binding<TApparent, TConcrete> BindAsSubContainer<TApparent, TConcrete>(
178183

179184
foreach (var initializationDelegate in initializeDelegates)
180185
{
181-
initializationDelegate.Invoke(subContainer);
186+
switch (initializationDelegate)
187+
{
188+
case AsyncContainerDelegate asyncInitializationDelegate:
189+
await asyncInitializationDelegate.Invoke(subContainer, ct);
190+
break;
191+
case ContainerDelegate syncInitializationDelegate:
192+
syncInitializationDelegate.Invoke(subContainer);
193+
break;
194+
default:
195+
throw new InvalidOperationException($"Unexpected initialization delegate type: {initializationDelegate.GetType()}");
196+
}
182197
}
183198

184199
foreach (var startupDelegate in startupDelegates)
@@ -218,9 +233,19 @@ public async ValueTask<DiContainer> Build(CancellationToken ct)
218233
injectDelegate.Invoke(diContainer);
219234
}
220235

221-
foreach (var initializeDelegate in initializeDelegates)
236+
foreach (var initializationDelegate in initializeDelegates)
222237
{
223-
initializeDelegate.Invoke(diContainer);
238+
switch (initializationDelegate)
239+
{
240+
case AsyncContainerDelegate asyncInitializationDelegate:
241+
await asyncInitializationDelegate.Invoke(diContainer, ct);
242+
break;
243+
case ContainerDelegate syncInitializationDelegate:
244+
syncInitializationDelegate.Invoke(diContainer);
245+
break;
246+
default:
247+
throw new InvalidOperationException($"Unexpected initialization delegate type: {initializationDelegate.GetType()}");
248+
}
224249
}
225250

226251
foreach (var startupDelegate in startupDelegates)

0 commit comments

Comments
 (0)