# HG changeset patch # User Steven Robbins # Date 1295028741 0 # Node ID 487fccc605996355257840af72cdaa16c64ba9fc # Parent 910f6a576d119ec650d261229801814a79a2f94e ResolveAll and IEnumerable depenencies now work as expected in a container hierarchy. diff -r 910f6a576d119ec650d261229801814a79a2f94e -r 487fccc605996355257840af72cdaa16c64ba9fc src/TinyIoC.Tests/TestData/BasicClasses.cs --- a/src/TinyIoC.Tests/TestData/BasicClasses.cs Fri Jan 14 15:07:32 2011 +0000 +++ b/src/TinyIoC.Tests/TestData/BasicClasses.cs Fri Jan 14 18:12:21 2011 +0000 @@ -347,13 +347,25 @@ internal class TestClassEnumerableDependency { - IEnumerable _Enumerable; + public IEnumerable Enumerable {get; private set;} - public int EnumerableCount { get { return _Enumerable == null ? 0 : _Enumerable.Count(); } } + public int EnumerableCount { get { return Enumerable == null ? 0 : Enumerable.Count(); } } public TestClassEnumerableDependency(IEnumerable enumerable) { - _Enumerable = enumerable; + Enumerable = enumerable; + } + } + + internal class TestClassEnumerableDependency2 + { + public IEnumerable Enumerable { get; private set; } + + public int EnumerableCount { get { return Enumerable == null ? 0 : Enumerable.Count(); } } + + public TestClassEnumerableDependency2(IEnumerable enumerable) + { + Enumerable = enumerable; } } diff -r 910f6a576d119ec650d261229801814a79a2f94e -r 487fccc605996355257840af72cdaa16c64ba9fc src/TinyIoC.Tests/TinyIoCTests.cs --- a/src/TinyIoC.Tests/TinyIoCTests.cs Fri Jan 14 15:07:32 2011 +0000 +++ b/src/TinyIoC.Tests/TinyIoCTests.cs Fri Jan 14 18:12:21 2011 +0000 @@ -2922,5 +2922,146 @@ Assert.IsTrue(object.ReferenceEquals(result.Dependency, secondChildInstance)); } + + [TestMethod] + public void ResolveAll_ChildContainerNoRegistrationsParentContainerHasRegistrations_ReturnsAllParentRegistrations() + { + var parentContainer = UtilityMethods.GetContainer(); + var childContainer = parentContainer.GetChildContainer(); + parentContainer.Register(new TestClassDefaultCtor(), "1"); + parentContainer.Register(new TestClassDefaultCtor(), "2"); + parentContainer.Register(new TestClassDefaultCtor(), "3"); + + var result = childContainer.ResolveAll(); + + Assert.AreEqual(3, result.Count()); + } + + [TestMethod] + public void ResolveAll_ChildContainerHasRegistrationsParentContainerHasRegistrations_ReturnsAllRegistrations() + { + var parentContainer = UtilityMethods.GetContainer(); + var childContainer = parentContainer.GetChildContainer(); + parentContainer.Register(new TestClassDefaultCtor(), "1"); + parentContainer.Register(new TestClassDefaultCtor(), "2"); + parentContainer.Register(new TestClassDefaultCtor(), "3"); + childContainer.Register(new TestClassDefaultCtor(), "4"); + childContainer.Register(new TestClassDefaultCtor(), "5"); + childContainer.Register(new TestClassDefaultCtor(), "6"); + + var result = childContainer.ResolveAll(); + + Assert.AreEqual(6, result.Count()); + } + + [TestMethod] + public void ResolveAll_ChildContainerRegistrationsParentContainerNoRegistrations_ReturnsAllChildRegistrations() + { + var parentContainer = UtilityMethods.GetContainer(); + var childContainer = parentContainer.GetChildContainer(); + childContainer.Register(new TestClassDefaultCtor(), "1"); + childContainer.Register(new TestClassDefaultCtor(), "2"); + childContainer.Register(new TestClassDefaultCtor(), "3"); + + var result = childContainer.ResolveAll(); + + Assert.AreEqual(3, result.Count()); + } + + [TestMethod] + public void ResolveAll_ParentContainerMultiInstanceRegistrationWithDependencyInChildContainer_ReturnsRegistrationWithChildContainerDependencyInstance() + { + var parentContainer = UtilityMethods.GetContainer(); + var childContainer = parentContainer.GetChildContainer(); + var parentInstance = new TestClassDefaultCtor(); + var childInstance = new TestClassDefaultCtor(); + parentContainer.Register("1").AsMultiInstance(); + parentContainer.Register(parentInstance); + childContainer.Register("2").AsMultiInstance(); + childContainer.Register(childInstance); + + var result = childContainer.ResolveAll(false).ToArray(); + var item1 = result[0] as TestClassWithInterfaceDependency; + var item2 = result[1] as TestClassWithInterfaceDependency; + + Assert.IsNotNull(item1); + Assert.IsNotNull(item2); + Assert.IsFalse(object.ReferenceEquals(item1, item2), "items are same instance"); + Assert.IsTrue(object.ReferenceEquals(item1.Dependency, childInstance), "item1 has wrong dependency"); + Assert.IsTrue(object.ReferenceEquals(item2.Dependency, childInstance), "item2 has wrong dependency"); + } + + [TestMethod] + public void Resolve_IEnumerableDependencyClassInChildContainerChildContainerNoRegistrationsParentContainerHasRegistrations_ReturnsAllParentRegistrations() + { + var parentContainer = UtilityMethods.GetContainer(); + var childContainer = parentContainer.GetChildContainer(); + parentContainer.Register(new TestClassDefaultCtor(), "1"); + parentContainer.Register(new TestClassDefaultCtor(), "2"); + parentContainer.Register(new TestClassDefaultCtor(), "3"); + childContainer.Register(); + + var result = childContainer.Resolve(); + + Assert.AreEqual(3, result.EnumerableCount); + } + + [TestMethod] + public void Resolve_IEnumerableDependencyClassInChildContainerChildContainerHasRegistrationsParentContainerHasRegistrations_ReturnsAllRegistrations() + { + var parentContainer = UtilityMethods.GetContainer(); + var childContainer = parentContainer.GetChildContainer(); + parentContainer.Register(new TestClassDefaultCtor(), "1"); + parentContainer.Register(new TestClassDefaultCtor(), "2"); + parentContainer.Register(new TestClassDefaultCtor(), "3"); + childContainer.Register(new TestClassDefaultCtor(), "4"); + childContainer.Register(new TestClassDefaultCtor(), "5"); + childContainer.Register(new TestClassDefaultCtor(), "6"); + childContainer.Register(); + + var result = childContainer.Resolve(); + + Assert.AreEqual(6, result.EnumerableCount); + } + + [TestMethod] + public void Resolve_IEnumerableDependencyClassInChildContainerChildContainerRegistrationsParentContainerNoRegistrations_ReturnsAllChildRegistrations() + { + var parentContainer = UtilityMethods.GetContainer(); + var childContainer = parentContainer.GetChildContainer(); + childContainer.Register(new TestClassDefaultCtor(), "1"); + childContainer.Register(new TestClassDefaultCtor(), "2"); + childContainer.Register(new TestClassDefaultCtor(), "3"); + childContainer.Register(); + + var result = childContainer.Resolve(); + + Assert.AreEqual(3, result.EnumerableCount); + } + + [TestMethod] + public void Resolve_IEnumerableDependencyClassInChildContainerParentContainerMultiInstanceRegistrationWithDependencyInChildContainer_ReturnsRegistrationWithChildContainerDependencyInstance() + { + var parentContainer = UtilityMethods.GetContainer(); + var childContainer = parentContainer.GetChildContainer(); + var parentInstance = new TestClassDefaultCtor(); + var childInstance = new TestClassDefaultCtor(); + parentContainer.Register("1").AsMultiInstance(); + parentContainer.Register(parentInstance); + childContainer.Register("2").AsMultiInstance(); + childContainer.Register(childInstance); + childContainer.Register(); + + var result = childContainer.Resolve().Enumerable.ToArray(); + var item1 = result[0] as TestClassWithInterfaceDependency; + var item2 = result[1] as TestClassWithInterfaceDependency; + + Assert.IsNotNull(item1); + Assert.IsNotNull(item2); + Assert.IsFalse(object.ReferenceEquals(item1, item2), "items are same instance"); + Assert.IsTrue(object.ReferenceEquals(item1.Dependency, childInstance), "item1 has wrong dependency"); + Assert.IsTrue(object.ReferenceEquals(item2.Dependency, childInstance), "item2 has wrong dependency"); + } + } } diff -r 910f6a576d119ec650d261229801814a79a2f94e -r 487fccc605996355257840af72cdaa16c64ba9fc src/TinyIoC/TinyIoC.cs --- a/src/TinyIoC/TinyIoC.cs Fri Jan 14 15:07:32 2011 +0000 +++ b/src/TinyIoC/TinyIoC.cs Fri Jan 14 18:12:21 2011 +0000 @@ -2867,9 +2867,19 @@ } } + private IEnumerable GetParentRegistrationsForType(Type resolveType) + { + if (_Parent == null) + return new TypeRegistration[] { }; + + var registrations = _Parent._RegisteredTypes.Keys.Where(tr => tr.Type == resolveType); + + return registrations.Concat(_Parent.GetParentRegistrationsForType(resolveType)); + } + private IEnumerable ResolveAllInternal(Type resolveType, bool includeUnnamed) { - var registrations = _RegisteredTypes.Keys.Where(tr => tr.Type == resolveType); + var registrations = _RegisteredTypes.Keys.Where(tr => tr.Type == resolveType).Concat(GetParentRegistrationsForType(resolveType)); if (!includeUnnamed) registrations = registrations.Where(tr => tr.Name != string.Empty);