Merge pull request #57 from JCH2k/master

Fixed validation with parameter for registrations without factory
pull/59/head
Simon G 3 years ago committed by GitHub
commit 2acc4e0bf5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 8
      LightweightIocContainer/Validation/IocValidator.cs
  2. 43
      Test.LightweightIocContainer/IocValidatorTest.cs

@ -47,12 +47,13 @@ namespace LightweightIocContainer.Validation
foreach (IRegistration registration in _iocContainer.Registrations) foreach (IRegistration registration in _iocContainer.Registrations)
{ {
var definedParameters = _parameters.Where(p => p.type == registration.InterfaceType);
if (registration is IWithFactoryInternal { Factory: { } } withFactoryRegistration) if (registration is IWithFactoryInternal { Factory: { } } withFactoryRegistration)
{ {
(from createMethod in withFactoryRegistration.Factory.CreateMethods (from createMethod in withFactoryRegistration.Factory.CreateMethods
select createMethod.GetParameters().Select(p => p.ParameterType) select createMethod.GetParameters().Select(p => p.ParameterType)
into parameterTypes into parameterTypes
let definedParameters = _parameters.Where(p => p.type == registration.InterfaceType)
select (from parameterType in parameterTypes select (from parameterType in parameterTypes
let definedParameter = definedParameters let definedParameter = definedParameters
.FirstOrDefault(p => parameterType.IsInstanceOfType(p.parameter)) .FirstOrDefault(p => parameterType.IsInstanceOfType(p.parameter))
@ -61,7 +62,10 @@ namespace LightweightIocContainer.Validation
.ForEach(p => TryResolve(registration.InterfaceType, p, validationExceptions, true)); .ForEach(p => TryResolve(registration.InterfaceType, p, validationExceptions, true));
} }
else else
TryResolve(registration.InterfaceType, null, validationExceptions); {
var arguments = definedParameters.Select(p => p.parameter).ToArray();
TryResolve(registration.InterfaceType, arguments, validationExceptions);
}
} }
if (validationExceptions.Any()) if (validationExceptions.Any())

@ -45,12 +45,17 @@ namespace Test.LightweightIocContainer
ITest Create(); ITest Create();
} }
private class TestInstaller : IIocInstaller private class TestInstallerNoFactory : IIocInstaller
{
public void Install(IRegistrationCollector registration) => registration.Add<ITest, Test>();
}
private class TestInstallerWithFactory : IIocInstaller
{ {
public void Install(IRegistrationCollector registration) => registration.Add<ITest, Test>().WithFactory<ITestFactory>(); public void Install(IRegistrationCollector registration) => registration.Add<ITest, Test>().WithFactory<ITestFactory>();
} }
private class InvalidTestInstaller : IIocInstaller private class TestInstallerWithInvalidFactory : IIocInstaller
{ {
public void Install(IRegistrationCollector registration) => registration.Add<ITest, Test>().WithFactory<IInvalidFactory>(); public void Install(IRegistrationCollector registration) => registration.Add<ITest, Test>().WithFactory<IInvalidFactory>();
} }
@ -59,7 +64,20 @@ namespace Test.LightweightIocContainer
public void TestValidate() public void TestValidate()
{ {
IocContainer iocContainer = new(); IocContainer iocContainer = new();
iocContainer.Install(new TestInstaller()); iocContainer.Install(new TestInstallerNoFactory());
IocValidator validator = new(iocContainer);
var aggregateException = Assert.Throws<AggregateException>(() => validator.Validate());
AssertNoMatchingConstructorFoundForType<Test>(aggregateException);
}
[Test]
public void TestValidateWithFactory()
{
IocContainer iocContainer = new();
iocContainer.Install(new TestInstallerWithFactory());
IocValidator validator = new(iocContainer); IocValidator validator = new(iocContainer);
@ -70,7 +88,7 @@ namespace Test.LightweightIocContainer
public void TestValidateWithParameter() public void TestValidateWithParameter()
{ {
IocContainer iocContainer = new(); IocContainer iocContainer = new();
iocContainer.Install(new TestInstaller()); iocContainer.Install(new TestInstallerNoFactory());
IocValidator validator = new(iocContainer); IocValidator validator = new(iocContainer);
@ -88,17 +106,22 @@ namespace Test.LightweightIocContainer
public void TestValidateInvalidFactory() public void TestValidateInvalidFactory()
{ {
IocContainer iocContainer = new(); IocContainer iocContainer = new();
iocContainer.Install(new InvalidTestInstaller()); iocContainer.Install(new TestInstallerWithInvalidFactory());
IocValidator validator = new(iocContainer); IocValidator validator = new(iocContainer);
AggregateException aggregateException = Assert.Throws<AggregateException>(() => validator.Validate()); var aggregateException = Assert.Throws<AggregateException>(() => validator.Validate());
Exception exception = aggregateException?.InnerExceptions[0]; AssertNoMatchingConstructorFoundForType<Test>(aggregateException);
}
private static void AssertNoMatchingConstructorFoundForType<T>(AggregateException aggregateException)
{
Exception exception = aggregateException?.InnerExceptions[0];
Assert.IsInstanceOf<NoMatchingConstructorFoundException>(exception); Assert.IsInstanceOf<NoMatchingConstructorFoundException>(exception);
NoMatchingConstructorFoundException noMatchingConstructorFoundException = (NoMatchingConstructorFoundException) exception; NoMatchingConstructorFoundException noMatchingConstructorFoundException = (NoMatchingConstructorFoundException)exception;
Assert.AreEqual(typeof(Test), noMatchingConstructorFoundException?.Type); Assert.AreEqual(typeof(T), noMatchingConstructorFoundException?.Type);
} }
} }
} }
Loading…
Cancel
Save