From f530cc1301f1330a8145ebf93edd1fc665ba02ef Mon Sep 17 00:00:00 2001 From: "Simon G." Date: Wed, 18 Dec 2024 14:50:15 +0100 Subject: [PATCH] - fix invalidOperationException when trying to resolve a type, that is registered as an open generic, as a parameter --- LightweightIocContainer/IocContainer.cs | 16 ++++++++++---- .../OpenGenericRegistrationTest.cs | 22 +++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/LightweightIocContainer/IocContainer.cs b/LightweightIocContainer/IocContainer.cs index a3fa7de..f31230a 100644 --- a/LightweightIocContainer/IocContainer.cs +++ b/LightweightIocContainer/IocContainer.cs @@ -231,10 +231,18 @@ public class IocContainer : IIocContainer, IIocResolver parametersToResolve ??= []; parametersToResolve.Insert(0, multitonScopeArgument); //insert scope at first place, won't be passed to ctor when creating multiton } - - if (result) - return (true, new InternalToBeResolvedPlaceholder(registeredType, registration, parametersToResolve), null); - + + switch (result) + { + case true when registration is IOpenGenericRegistration openGenericRegistration: + { + Type genericImplementationType = openGenericRegistration.ImplementationType.MakeGenericType(typeof(T).GenericTypeArguments); + return (true, new InternalToBeResolvedPlaceholder(genericImplementationType, registration, parametersToResolve), null); + } + case true: + return (true, new InternalToBeResolvedPlaceholder(registeredType, registration, parametersToResolve), null); + } + if (exception != null) return (false, new object(), exception); diff --git a/Test.LightweightIocContainer/OpenGenericRegistrationTest.cs b/Test.LightweightIocContainer/OpenGenericRegistrationTest.cs index 3985b61..8f09b3e 100644 --- a/Test.LightweightIocContainer/OpenGenericRegistrationTest.cs +++ b/Test.LightweightIocContainer/OpenGenericRegistrationTest.cs @@ -49,6 +49,18 @@ public class OpenGenericRegistrationTest ITest Create(T item) where T : IConstraint, new(); } + [UsedImplicitly] + public interface IA; + + [UsedImplicitly] + public class A : IA + { + public A(ITest test) + { + + } + } + [SetUp] public void SetUp() => _iocContainer = new IocContainer(); @@ -104,4 +116,14 @@ public class OpenGenericRegistrationTest ITest test = testFactory.Create(new Constraint()); Assert.That(test, Is.InstanceOf>()); } + + [Test] + public void TestOpenGenericTypeAsParameter() + { + _iocContainer.Register(r => r.Add()); + _iocContainer.Register(r => r.AddOpenGenerics(typeof(ITest<>), typeof(Test<>), Lifestyle.Singleton)); + + IA a = _iocContainer.Resolve(); + Assert.That(a, Is.TypeOf()); + } } \ No newline at end of file