From a6f446666e0597fabe90df9aca3abfd6ed68789d Mon Sep 17 00:00:00 2001 From: Simon G Date: Thu, 1 Sep 2022 17:17:08 +0200 Subject: [PATCH] - don't allow to use ctors where not all given arguments are used - fix wrong parameter array size --- LightweightIocContainer/IocContainer.cs | 9 ++++-- .../IocContainerParameterRegistrationTest.cs | 32 ++++++++++++------- .../IocContainerTest.cs | 21 +++++++----- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/LightweightIocContainer/IocContainer.cs b/LightweightIocContainer/IocContainer.cs index 0dfa625..04c1a50 100644 --- a/LightweightIocContainer/IocContainer.cs +++ b/LightweightIocContainer/IocContainer.cs @@ -406,7 +406,7 @@ public class IocContainer : IIocContainer, IIocResolver if (arguments != null && arguments.Any()) //if more arguments were passed to resolve { - int argumentsSize = registration.Parameters.Length + arguments.Length; + int argumentsSize = registration.Parameters.Count(p => p is not InternalResolvePlaceholder) + arguments.Length; object?[] newArguments = new object[argumentsSize]; for (int i = 0; i < argumentsSize; i++) @@ -532,7 +532,12 @@ public class IocContainer : IIocContainer, IIocResolver parameters.Add(fittingArgument); } - return (!parameters.Any(p => p is InternalResolvePlaceholder), parameters, exceptions); + if (passedArguments == null || !passedArguments.Any()) + return (!parameters.Any(p => p is InternalResolvePlaceholder), parameters, exceptions); + + exceptions.Add(new ConstructorNotMatchingException(constructor, new Exception("Not all given arguments were used!"))); + return (false, parameters, exceptions); + } /// diff --git a/Test.LightweightIocContainer/IocContainerParameterRegistrationTest.cs b/Test.LightweightIocContainer/IocContainerParameterRegistrationTest.cs index 4f965a3..09080d3 100644 --- a/Test.LightweightIocContainer/IocContainerParameterRegistrationTest.cs +++ b/Test.LightweightIocContainer/IocContainerParameterRegistrationTest.cs @@ -36,6 +36,7 @@ public class IocContainerParameterRegistrationTest { IA A { get; } IA A2 { get; } + IA A3 { get; } IB B { get; } IC C { get; } } @@ -71,16 +72,18 @@ public class IocContainerParameterRegistrationTest [UsedImplicitly] private class D : ID { - public D(IA a, IA a2, IB b, IC c) + public D(IA a, IA a2, IA a3, IB b, IC c) { A = a; A2 = a2; + A3 = a3; B = b; C = c; } public IA A { get; } public IA A2 { get; } + public IA A3 { get; } public IB B { get; } public IC C { get; } } @@ -104,8 +107,8 @@ public class IocContainerParameterRegistrationTest _iocContainer.Register(r => r.Add().WithParameters(b, c)); IA a = _iocContainer.Resolve(); - Assert.AreEqual(b, a.B); - Assert.AreEqual(c, a.C); + Assert.AreSame(b, a.B); + Assert.AreSame(c, a.C); } [Test] @@ -117,8 +120,8 @@ public class IocContainerParameterRegistrationTest _iocContainer.Register(r => r.Add().WithParameters(b)); IA a = _iocContainer.Resolve(c); - Assert.AreEqual(b, a.B); - Assert.AreEqual(c, a.C); + Assert.AreSame(b, a.B); + Assert.AreSame(c, a.C); } [Test] @@ -128,14 +131,16 @@ public class IocContainerParameterRegistrationTest IB b = new B(c); IA a = new A(b, c); IA a2 = new A(b, c); + IA a3 = new A(b, c); - _iocContainer.Register(r => r.Add().WithParameters((0, a), (2, b), (3, c))); + _iocContainer.Register(r => r.Add().WithParameters((0, a), (2, a3), (3, b), (4, c))); ID d = _iocContainer.Resolve(a2); - Assert.AreEqual(a, d.A); - Assert.AreEqual(a2, d.A2); - Assert.AreEqual(b, d.B); - Assert.AreEqual(c, d.C); + Assert.AreSame(a, d.A); + Assert.AreSame(a2, d.A2); + Assert.AreSame(a3, d.A3); + Assert.AreSame(b, d.B); + Assert.AreSame(c, d.C); } [Test] @@ -147,12 +152,15 @@ public class IocContainerParameterRegistrationTest IA a2 = new A(b, c); _iocContainer.Register(r => r.Add().WithParameters(a2)); + _iocContainer.Register(r => r.Add()); _iocContainer.Register(r => r.Add()); _iocContainer.Register(r => r.Add()); ID d = _iocContainer.Resolve(a); - Assert.AreEqual(a, d.A2); - Assert.AreEqual(a2, d.A); + Assert.AreSame(a, d.A2); + Assert.AreSame(a2, d.A); + Assert.AreNotSame(a, d.A3); + Assert.AreNotSame(a2, d.A3); } } \ No newline at end of file diff --git a/Test.LightweightIocContainer/IocContainerTest.cs b/Test.LightweightIocContainer/IocContainerTest.cs index 6ed266a..31a6eca 100644 --- a/Test.LightweightIocContainer/IocContainerTest.cs +++ b/Test.LightweightIocContainer/IocContainerTest.cs @@ -73,6 +73,8 @@ public class IocContainerTest private class TestWithFoo : ITest { public TestWithFoo(IFoo testFoo) => TestFoo = testFoo; + + [UsedImplicitly] public IFoo TestFoo { get; } } @@ -333,18 +335,21 @@ public class IocContainerTest Assert.IsInstanceOf(test); } - + [Test] - public void TestResolveParameterWithParameterThatIsAlreadyExistingSingleton() + public void TestResolveParameterWithTwoParameters() { - _iocContainer.Register(r => r.Add()); + _iocContainer.Register(r => r.Add().WithParameters(new Foo())); _iocContainer.Register(r => r.Add(Lifestyle.Singleton).WithParameters("TestString")); - IFoo foo = _iocContainer.Resolve(); - ITest test = _iocContainer.Resolve("testName"); - - Assert.IsInstanceOf(test); - Assert.AreSame(foo, ((TestWithFoo) test).TestFoo); + _iocContainer.Resolve(); + } + + [Test] + public void TestResolveTypeWithToManyParameters() + { + _iocContainer.Register(r => r.Add().WithParameters(new Foo())); + Assert.Throws(() => _iocContainer.Resolve(new Foo())); } [Test]