- multitons need first argument in ctor to be scope

ImplementExpressionTrees
Simon G 3 years ago
parent 25d3d094e8
commit a163e19c1e
  1. 9
      LightweightIocContainer/IocContainer.cs
  2. 12
      Test.LightweightIocContainer/DisposeStrategyTest.cs
  3. 12
      Test.LightweightIocContainer/FluentFactoryRegistrationTest.cs
  4. 10
      Test.LightweightIocContainer/IocContainerTest.cs
  5. 7
      Test.LightweightIocContainer/MultipleMultitonRegistrationTest.cs

@ -167,16 +167,9 @@ public class IocContainer : IIocContainer, IIocResolver
if (registration is IWithParametersInternal { Parameters: { } } registrationWithParameters) if (registration is IWithParametersInternal { Parameters: { } } registrationWithParameters)
arguments = UpdateArgumentsWithRegistrationParameters(registrationWithParameters, arguments); arguments = UpdateArgumentsWithRegistrationParameters(registrationWithParameters, arguments);
List<object?>? resolveArguments = arguments?.ToList();
if (resolveArguments != null && registration is IMultitonRegistration multitonReg) //remove scope argument for multitions
{
object multitonScopeArgument = TryGetMultitonScopeArgument(multitonReg, resolveArguments);
resolveArguments.Remove(multitonScopeArgument);
}
Type registeredType = GetType<T>(registration); Type registeredType = GetType<T>(registration);
(bool result, List<object?>? parametersToResolve, NoMatchingConstructorFoundException? exception) = (bool result, List<object?>? parametersToResolve, NoMatchingConstructorFoundException? exception) =
TryGetTypeResolveStack(registeredType, resolveArguments, internalResolveStack); TryGetTypeResolveStack(registeredType, arguments, internalResolveStack);
if (registration is IMultitonRegistration multitonRegistration) if (registration is IMultitonRegistration multitonRegistration)
{ {

@ -23,6 +23,14 @@ public class DisposeStrategyTest
public void Dispose() => throw new Exception(); public void Dispose() => throw new Exception();
} }
private class TestMultiton : Test
{
public TestMultiton(int scope)
{
}
}
private class TestNotDisposable private class TestNotDisposable
{ {
@ -44,7 +52,7 @@ public class DisposeStrategyTest
public void TestValidContainerDisposeStrategyMultiton() public void TestValidContainerDisposeStrategyMultiton()
{ {
IocContainer iocContainer = new(); IocContainer iocContainer = new();
iocContainer.Register(r => r.AddMultiton<ITest, Test, int>().WithDisposeStrategy(DisposeStrategy.Container)); iocContainer.Register(r => r.AddMultiton<ITest, TestMultiton, int>().WithDisposeStrategy(DisposeStrategy.Container));
iocContainer.Resolve<ITest>(1); iocContainer.Resolve<ITest>(1);
@ -66,7 +74,7 @@ public class DisposeStrategyTest
public void TestValidAppDisposeStrategyMultiton() public void TestValidAppDisposeStrategyMultiton()
{ {
IocContainer iocContainer = new(); IocContainer iocContainer = new();
iocContainer.Register(r => r.AddMultiton<ITest, Test, int>().WithDisposeStrategy(DisposeStrategy.Application)); iocContainer.Register(r => r.AddMultiton<ITest, TestMultiton, int>().WithDisposeStrategy(DisposeStrategy.Application));
iocContainer.Resolve<ITest>(1); iocContainer.Resolve<ITest>(1);

@ -102,6 +102,14 @@ public class FluentFactoryRegistrationTest
public ITest Create(byte id) => throw new NotImplementedException(); public ITest Create(byte id) => throw new NotImplementedException();
} }
public class TestMultiton : ITest
{
public TestMultiton(MultitonScope scope)
{
}
}
[UsedImplicitly] [UsedImplicitly]
public interface IMultitonTestFactory public interface IMultitonTestFactory
{ {
@ -290,7 +298,7 @@ public class FluentFactoryRegistrationTest
[Test] [Test]
public void TestResolveMultitonFromFactory() public void TestResolveMultitonFromFactory()
{ {
_iocContainer.Register(r => r.AddMultiton<ITest, Test, MultitonScope>().WithFactory<IMultitonTestFactory>()); _iocContainer.Register(r => r.AddMultiton<ITest, TestMultiton, MultitonScope>().WithFactory<IMultitonTestFactory>());
MultitonScope scope1 = new(); MultitonScope scope1 = new();
MultitonScope scope2 = new(); MultitonScope scope2 = new();
@ -309,7 +317,7 @@ public class FluentFactoryRegistrationTest
[Test] [Test]
public void TestResolveMultitonFromFactoryClearInstances() public void TestResolveMultitonFromFactoryClearInstances()
{ {
_iocContainer.Register(r => r.AddMultiton<ITest, Test, MultitonScope>().WithFactory<IMultitonTestFactory>()); _iocContainer.Register(r => r.AddMultiton<ITest, TestMultiton, MultitonScope>().WithFactory<IMultitonTestFactory>());
MultitonScope scope1 = new(); MultitonScope scope1 = new();
MultitonScope scope2 = new(); MultitonScope scope2 = new();

@ -27,6 +27,14 @@ public class IocContainerTest
} }
private class TestMultiton : ITest
{
public TestMultiton(MultitonScope multitonScope)
{
}
}
[UsedImplicitly] [UsedImplicitly]
private class TestConstructor : ITest private class TestConstructor : ITest
{ {
@ -248,7 +256,7 @@ public class IocContainerTest
[Test] [Test]
public void TestResolveMultiton() public void TestResolveMultiton()
{ {
_iocContainer.Register(r => r.AddMultiton<ITest, Test, MultitonScope>()); _iocContainer.Register(r => r.AddMultiton<ITest, TestMultiton, MultitonScope>());
MultitonScope scope1 = new(); MultitonScope scope1 = new();
MultitonScope scope2 = new(); MultitonScope scope2 = new();

@ -26,8 +26,13 @@ public class MultipleMultitonRegistrationTest
} }
[UsedImplicitly] [UsedImplicitly]
public class Test : ITest private class Test : ITest
{ {
public Test(MultitonScope scope)
{
}
public int Number { get; private set; } public int Number { get; private set; }
public void DoSomething(int number) => Number = number; public void DoSomething(int number) => Number = number;

Loading…
Cancel
Save