- don't allow to use ctors where not all given arguments are used

- fix wrong parameter array size
ImplementExpressionTrees
Simon G 3 years ago
parent 8b9edbfbe2
commit a6f446666e
  1. 9
      LightweightIocContainer/IocContainer.cs
  2. 32
      Test.LightweightIocContainer/IocContainerParameterRegistrationTest.cs
  3. 21
      Test.LightweightIocContainer/IocContainerTest.cs

@ -406,7 +406,7 @@ public class IocContainer : IIocContainer, IIocResolver
if (arguments != null && arguments.Any()) //if more arguments were passed to resolve 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]; object?[] newArguments = new object[argumentsSize];
for (int i = 0; i < argumentsSize; i++) for (int i = 0; i < argumentsSize; i++)
@ -532,7 +532,12 @@ public class IocContainer : IIocContainer, IIocResolver
parameters.Add(fittingArgument); 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);
} }
/// <summary> /// <summary>

@ -36,6 +36,7 @@ public class IocContainerParameterRegistrationTest
{ {
IA A { get; } IA A { get; }
IA A2 { get; } IA A2 { get; }
IA A3 { get; }
IB B { get; } IB B { get; }
IC C { get; } IC C { get; }
} }
@ -71,16 +72,18 @@ public class IocContainerParameterRegistrationTest
[UsedImplicitly] [UsedImplicitly]
private class D : ID 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; A = a;
A2 = a2; A2 = a2;
A3 = a3;
B = b; B = b;
C = c; C = c;
} }
public IA A { get; } public IA A { get; }
public IA A2 { get; } public IA A2 { get; }
public IA A3 { get; }
public IB B { get; } public IB B { get; }
public IC C { get; } public IC C { get; }
} }
@ -104,8 +107,8 @@ public class IocContainerParameterRegistrationTest
_iocContainer.Register(r => r.Add<IA, A>().WithParameters(b, c)); _iocContainer.Register(r => r.Add<IA, A>().WithParameters(b, c));
IA a = _iocContainer.Resolve<IA>(); IA a = _iocContainer.Resolve<IA>();
Assert.AreEqual(b, a.B); Assert.AreSame(b, a.B);
Assert.AreEqual(c, a.C); Assert.AreSame(c, a.C);
} }
[Test] [Test]
@ -117,8 +120,8 @@ public class IocContainerParameterRegistrationTest
_iocContainer.Register(r => r.Add<IA, A>().WithParameters(b)); _iocContainer.Register(r => r.Add<IA, A>().WithParameters(b));
IA a = _iocContainer.Resolve<IA>(c); IA a = _iocContainer.Resolve<IA>(c);
Assert.AreEqual(b, a.B); Assert.AreSame(b, a.B);
Assert.AreEqual(c, a.C); Assert.AreSame(c, a.C);
} }
[Test] [Test]
@ -128,14 +131,16 @@ public class IocContainerParameterRegistrationTest
IB b = new B(c); IB b = new B(c);
IA a = new A(b, c); IA a = new A(b, c);
IA a2 = new A(b, c); IA a2 = new A(b, c);
IA a3 = new A(b, c);
_iocContainer.Register(r => r.Add<ID, D>().WithParameters((0, a), (2, b), (3, c))); _iocContainer.Register(r => r.Add<ID, D>().WithParameters((0, a), (2, a3), (3, b), (4, c)));
ID d = _iocContainer.Resolve<ID>(a2); ID d = _iocContainer.Resolve<ID>(a2);
Assert.AreEqual(a, d.A); Assert.AreSame(a, d.A);
Assert.AreEqual(a2, d.A2); Assert.AreSame(a2, d.A2);
Assert.AreEqual(b, d.B); Assert.AreSame(a3, d.A3);
Assert.AreEqual(c, d.C); Assert.AreSame(b, d.B);
Assert.AreSame(c, d.C);
} }
[Test] [Test]
@ -147,12 +152,15 @@ public class IocContainerParameterRegistrationTest
IA a2 = new A(b, c); IA a2 = new A(b, c);
_iocContainer.Register(r => r.Add<ID, D>().WithParameters(a2)); _iocContainer.Register(r => r.Add<ID, D>().WithParameters(a2));
_iocContainer.Register(r => r.Add<IA, A>());
_iocContainer.Register(r => r.Add<IB, B>()); _iocContainer.Register(r => r.Add<IB, B>());
_iocContainer.Register(r => r.Add<IC, C>()); _iocContainer.Register(r => r.Add<IC, C>());
ID d = _iocContainer.Resolve<ID>(a); ID d = _iocContainer.Resolve<ID>(a);
Assert.AreEqual(a, d.A2); Assert.AreSame(a, d.A2);
Assert.AreEqual(a2, d.A); Assert.AreSame(a2, d.A);
Assert.AreNotSame(a, d.A3);
Assert.AreNotSame(a2, d.A3);
} }
} }

@ -73,6 +73,8 @@ public class IocContainerTest
private class TestWithFoo : ITest private class TestWithFoo : ITest
{ {
public TestWithFoo(IFoo testFoo) => TestFoo = testFoo; public TestWithFoo(IFoo testFoo) => TestFoo = testFoo;
[UsedImplicitly]
public IFoo TestFoo { get; } public IFoo TestFoo { get; }
} }
@ -333,18 +335,21 @@ public class IocContainerTest
Assert.IsInstanceOf<TestConstructor>(test); Assert.IsInstanceOf<TestConstructor>(test);
} }
[Test] [Test]
public void TestResolveParameterWithParameterThatIsAlreadyExistingSingleton() public void TestResolveParameterWithTwoParameters()
{ {
_iocContainer.Register(r => r.Add<ITest, TestWithFoo>()); _iocContainer.Register(r => r.Add<ITest, TestWithFoo>().WithParameters(new Foo()));
_iocContainer.Register(r => r.Add<IFoo, FooConstructor>(Lifestyle.Singleton).WithParameters("TestString")); _iocContainer.Register(r => r.Add<IFoo, FooConstructor>(Lifestyle.Singleton).WithParameters("TestString"));
IFoo foo = _iocContainer.Resolve<IFoo>(); _iocContainer.Resolve<ITest>();
ITest test = _iocContainer.Resolve<ITest>("testName"); }
Assert.IsInstanceOf<TestWithFoo>(test); [Test]
Assert.AreSame(foo, ((TestWithFoo) test).TestFoo); public void TestResolveTypeWithToManyParameters()
{
_iocContainer.Register(r => r.Add<ITest, TestWithFoo>().WithParameters(new Foo()));
Assert.Throws<NoMatchingConstructorFoundException>(() => _iocContainer.Resolve<ITest>(new Foo()));
} }
[Test] [Test]

Loading…
Cancel
Save