Skip to content

Commit 9ea2891

Browse files
committed
fix(#80): When binding constraint not working for dependencies after the first one
The container was losing track of the binding injected into thus the checks after the first one were not pointing to the right binding
1 parent fac6188 commit 9ea2891

2 files changed

Lines changed: 36 additions & 5 deletions

File tree

ManualDi.Async/ManualDi.Async.Tests/TestDiContainerBindingWhen.cs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,37 @@ namespace ManualDi.Async.Tests;
66

77
public class TestDiContainerBindingWhen
88
{
9-
private record NestedInt(int Value);
9+
internal class Special;
10+
internal class Child;
11+
internal class Root(Child child, Special special);
12+
13+
public class NestedInt(int value)
14+
{
15+
public int Value { get; } = value;
16+
}
17+
18+
[Test]
19+
public async Task TestWhenInjectedIntoNested()
20+
{
21+
//This test checks that the Binding pointer is not lost
22+
//The Root depends on both Child and Special and special is the second dependency
23+
//If this succeeds, it means that the Root binding pointer is not lost
24+
await using var container = await new DiContainerBindings().Install(b =>
25+
{
26+
b.Bind<Special>().FromConstructor().When(x => x.InjectedIntoType<Root>());
27+
b.Bind<Root>().FromConstructor();
28+
b.Bind<Child>().FromConstructor();
29+
})
30+
.WithFailureDebugReport()
31+
.Build(CancellationToken.None);
32+
}
1033

1134
[Test]
1235
public async Task TestWhenInjectedIntoType()
1336
{
1437
await using var container = await new DiContainerBindings().Install(b =>
1538
{
16-
b.Bind<NestedInt>().FromMethod(c => new NestedInt(c.Resolve<int>())).DependsOn(d => d.ConstructorDependency<int>());
39+
b.Bind<NestedInt>().FromConstructor();
1740
b.Bind<int>().FromInstance(1).When(x => x.InjectedIntoType<object>());
1841
b.Bind<int>().FromInstance(2).When(x => x.InjectedIntoType<NestedInt>());
1942
}).Build(CancellationToken.None);
@@ -27,7 +50,7 @@ public async Task TestWhenInjectedIntoId()
2750
{
2851
await using var container = await new DiContainerBindings().Install(b =>
2952
{
30-
b.Bind<NestedInt>().FromMethod(c => new NestedInt(c.Resolve<int>())).DependsOn(d => d.ConstructorDependency<int>()).WithId("2");
53+
b.Bind<NestedInt>().FromConstructor().WithId("2");
3154
b.Bind<int>().FromInstance(1).When(x => x.InjectedIntoId("1"));
3255
b.Bind<int>().FromInstance(2).When(x => x.InjectedIntoId("2"));
3356
}).Build(CancellationToken.None);

ManualDi.Async/ManualDi.Async/Container/DiContainer.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,10 @@ public void ConstructorDependency<T>()
190190
if (binding.BindingWiredState < BindingWiredState.Wired)
191191
{
192192
binding.BindingWiredState = BindingWiredState.Wired;
193+
var previousInjectedBinding = injectedBinding;
193194
injectedBinding = binding;
194195
binding.Dependencies?.Invoke(this);
196+
injectedBinding = previousInjectedBinding;
195197
bindings.Add(binding);
196198
}
197199
}
@@ -212,8 +214,10 @@ public void ConstructorDependency<T>(FilterBindingDelegate filter)
212214
if (binding.BindingWiredState < BindingWiredState.Wired)
213215
{
214216
binding.BindingWiredState = BindingWiredState.Wired;
217+
var previousInjectedBinding = injectedBinding;
215218
injectedBinding = binding;
216219
binding.Dependencies?.Invoke(this);
220+
injectedBinding = previousInjectedBinding;
217221
bindings.Add(binding);
218222
}
219223
}
@@ -230,8 +234,10 @@ public void NullableConstructorDependency<T>()
230234
if (binding.BindingWiredState < BindingWiredState.Wired)
231235
{
232236
binding.BindingWiredState = BindingWiredState.Wired;
237+
var previousInjectedBinding = injectedBinding;
233238
injectedBinding = binding;
234239
binding.Dependencies?.Invoke(this);
240+
injectedBinding = previousInjectedBinding;
235241
bindings.Add(binding);
236242
}
237243
}
@@ -248,11 +254,13 @@ public void NullableConstructorDependency<T>(FilterBindingDelegate filter)
248254
if (binding.BindingWiredState < BindingWiredState.Wired)
249255
{
250256
binding.BindingWiredState = BindingWiredState.Wired;
257+
var previousInjectedBinding = injectedBinding;
251258
injectedBinding = binding;
252259
binding.Dependencies?.Invoke(this);
260+
injectedBinding = previousInjectedBinding;
253261
bindings.Add(binding);
254262
}
255-
}
263+
}
256264

257265
public void InjectionDependency<T>()
258266
{
@@ -261,7 +269,7 @@ public void InjectionDependency<T>()
261269
{
262270
if (parentDiContainer is null)
263271
{
264-
throw new InvalidOperationException($"Type {typeof(T).FullName} injected into {injectedBinding?.GetType().FullName ?? "null"} is not registered.");
272+
throw new InvalidOperationException($"Type {typeof(T).FullName} injected into {injectedBinding?.ConcreteType.FullName ?? "null"} is not registered.");
265273
}
266274
parentDiContainer.InjectionDependency<T>();
267275
return;

0 commit comments

Comments
 (0)