Skip to content

Commit

Permalink
Use base container for resolving
Browse files Browse the repository at this point in the history
  • Loading branch information
patrickdreyer committed Dec 5, 2018
1 parent 931dcbc commit bc0bc14
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 2 deletions.
19 changes: 19 additions & 0 deletions BoDi.Tests/IsRegisteredTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,24 @@ public void ShouldReturnTrueIfTypeRegistered()

Assert.IsTrue(isRegistered);
}

[Test]
public void ShouldReturnTrueIfInterfaceRegisteredInBaseContainer()
{
// given

var baseContainer = new ObjectContainer();
var container = new ObjectContainer(baseContainer);

// when

baseContainer.RegisterTypeAs<VerySimpleClass, IInterface1>();

// then

bool isRegistered = container.IsRegistered<IInterface1>();

Assert.IsTrue(isRegistered);
}
}
}
17 changes: 17 additions & 0 deletions BoDi.Tests/ResolveAllTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,23 @@ public void ShouldResolveTheRightTypes()
Assert.IsTrue(results.Contains(container.Resolve<IFancy>("fancier")));
}

[Test]
public void ShouldResolveTypesRegisteredInBaseContainer()
{
// given
var baseContainer = new ObjectContainer();
var container = new ObjectContainer(baseContainer);
baseContainer.RegisterTypeAs<ImFancy, IFancy>("fancy");
baseContainer.RegisterTypeAs<ImFancier, IFancy>("fancier");

// when
var results = container.ResolveAll<IFancy>();

// then
Assert.IsTrue(results.Contains(container.Resolve<IFancy>("fancy")));
Assert.IsTrue(results.Contains(container.Resolve<IFancy>("fancier")));
}

}

}
8 changes: 6 additions & 2 deletions BoDi/BoDi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -611,14 +611,17 @@ public bool IsRegistered<T>(string name)

var keyToResolve = new RegistrationKey(typeToResolve, name);

return registrations.ContainsKey(keyToResolve);
if (registrations.ContainsKey(keyToResolve))
return true;
return baseContainer != null && baseContainer.IsRegistered<T>(name);
}

// ReSharper disable once UnusedParameter.Local
private void AssertNotResolved(RegistrationKey interfaceType)
{
if (resolvedObjects.ContainsKey(interfaceType))
throw new ObjectContainerException("An object has been resolved for this interface already.", null);
baseContainer?.AssertNotResolved(interfaceType);
}

private void ClearRegistrations(RegistrationKey registrationKey)
Expand Down Expand Up @@ -683,7 +686,8 @@ public IEnumerable<T> ResolveAll<T>() where T : class
{
return registrations
.Where(x => x.Key.Type == typeof(T))
.Select(x => Resolve (x.Key.Type, x.Key.Name) as T);
.Select(x => Resolve (x.Key.Type, x.Key.Name) as T)
.Union(baseContainer != null ? baseContainer.ResolveAll<T>() : new T[0]);
}

private object Resolve(Type typeToResolve, ResolutionList resolutionPath, string name)
Expand Down

0 comments on commit bc0bc14

Please sign in to comment.