Skip to content
This repository was archived by the owner on Sep 16, 2023. It is now read-only.

Commit c71ce10

Browse files
committed
Fix: When an object resolved without registration using the concrete type it cannot be resolved from sub context
1 parent c124e91 commit c71ce10

2 files changed

Lines changed: 27 additions & 6 deletions

File tree

BoDi.Tests/SubContainerTests.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,28 @@ public void ShouldResolveFromBaseContainer()
5555
var container = new ObjectContainer(baseContainer);
5656

5757
// when
58-
var objFromChild = container.Resolve<IInterface1>();
58+
var objFromChild = container.Resolve<IInterface1>();
5959
var objFromBase = baseContainer.Resolve<IInterface1>();
6060

6161
// then
6262
Assert.AreSame(objFromChild, objFromBase);
63-
}
64-
63+
}
64+
65+
[Test]
66+
public void ShouldResolveExistingObjectFromBaseWithoutTypeRegistration()
67+
{
68+
// given
69+
var baseContainer = new ObjectContainer();
70+
var container = new ObjectContainer(baseContainer);
71+
72+
// when
73+
var objFromBase = baseContainer.Resolve<VerySimpleClass>();
74+
var objFromChild = container.Resolve<VerySimpleClass>();
75+
76+
// then
77+
Assert.AreSame(objFromChild, objFromBase);
78+
}
79+
6580
[Test]
6681
public void ShouldBeAbleToOverrideBaseContainerRegistration()
6782
{

BoDi/BoDi.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
* Change history
1717
*
1818
* v1.3
19+
* - Fix: When an object resolved without registration using the concrete type it cannot be resolved from sub context
1920
* - Added IsRegistered methods to check if an interface or type is already registered (#6)
2021
* - Expose the ObjectContainer.RegisterFactoryAs in the IObjectContainer interface (by slawomir-brzezinski-at-interxion)
2122
* - eliminate internal TypeHelper class
@@ -765,12 +766,17 @@ private object ResolveObject(RegistrationKey keyToResolve, ResolutionList resolu
765766
if (keyToResolve.Type.IsPrimitive || keyToResolve.Type == typeof(string) || keyToResolve.Type.IsValueType)
766767
throw new ObjectContainerException("Primitive types or structs cannot be resolved: " + keyToResolve.Type.FullName, resolutionPath.ToTypeList());
767768

768-
var registrationResult = GetRegistrationResult(keyToResolve) ??
769+
var registrationResult = GetRegistrationResult(keyToResolve);
770+
var isImplicitTypeRegistration = registrationResult == null;
771+
var registrationToUse = registrationResult ??
769772
new KeyValuePair<ObjectContainer, IRegistration>(this, new TypeRegistration(keyToResolve.Type));
770773

771-
var resolutionPathForResolve = registrationResult.Key == this ?
774+
var resolutionPathForResolve = registrationToUse.Key == this ?
772775
resolutionPath : new ResolutionList();
773-
return registrationResult.Value.Resolve(registrationResult.Key, keyToResolve, resolutionPathForResolve);
776+
var result = registrationToUse.Value.Resolve(registrationToUse.Key, keyToResolve, resolutionPathForResolve);
777+
if (isImplicitTypeRegistration) // upon successful implicit registration, we register the rule, so that sub context can also get the same resolved value
778+
AddRegistration(keyToResolve, registrationToUse.Value);
779+
return result;
774780
}
775781

776782
private object CreateObject(Type type, ResolutionList resolutionPath, RegistrationKey keyToResolve)

0 commit comments

Comments
 (0)