diff --git a/src/Nano.DependencyInjector/ListExtension.cs b/src/Nano.DependencyInjector/ListExtension.cs index 18f1837..bb93185 100644 --- a/src/Nano.DependencyInjector/ListExtension.cs +++ b/src/Nano.DependencyInjector/ListExtension.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; namespace Nano.DependencyInjector { @@ -8,60 +7,80 @@ public static class ListExtensions { public static ITrue If(this IEnumerable list, Predicate ifStatement) { - var trueResult = list.Where(i => ifStatement(i)); - var falseResult = list.Where(i => !ifStatement(i)); - - return new IfResult(trueResult, falseResult); + return new IfTrueWrapper(list, ifStatement); } } - public class IfResult : ITrue + public class IfTrueWrapper : ITrue { - private readonly IEnumerable trueResult; - private readonly IEnumerable falseResult; + public IEnumerable List { get; } + public Predicate IfStatement { get; } + public Action TrueAction { get; private set; } - public IfResult(IEnumerable trueResult, IEnumerable falseResult) + public IfTrueWrapper(IEnumerable list, Predicate ifStatement) { - this.trueResult = trueResult; - this.falseResult = falseResult; + List = list; + IfStatement = ifStatement; } - public IFalse True(Action act) + public IFalse True(Action trueAction) { - foreach (var item in trueResult) - { - act(item); - } + TrueAction = trueAction; - return new ElseResult(falseResult); + return new ElseResult(this); } } public class ElseResult : IFalse { - private readonly IEnumerable falseResult; + private readonly IfTrueWrapper _ifTrueWrapper; + + public ElseResult(IfTrueWrapper ifTrueWrapper) + { + _ifTrueWrapper = ifTrueWrapper; + } - public ElseResult(IEnumerable falseResult) + void IFalse.False(Action falseAction) { - this.falseResult = falseResult; + InternalRun(_ifTrueWrapper.List, _ifTrueWrapper.IfStatement, _ifTrueWrapper.TrueAction, falseAction); } - void IFalse.False(Action act) + public void Run() { - foreach (var item in falseResult) + InternalRun(_ifTrueWrapper.List, _ifTrueWrapper.IfStatement, _ifTrueWrapper.TrueAction, null); + } + + private void InternalRun(IEnumerable list, + Predicate ifStatement, + Action trueAction, + Action falseAction) + { + foreach (var item in list) { - act(item); + if (ifStatement(item)) + { + trueAction(item); + } + else + { + falseAction?.Invoke(item); + } } } } + public interface IRunnable + { + void Run(); + } + public interface ITrue { - IFalse True(Action act); + IFalse True(Action trueAction); } - public interface IFalse + public interface IFalse : IRunnable { - void False(Action act); + void False(Action falseAction); } } \ No newline at end of file diff --git a/src/Nano.DependencyInjector/NanoDependencyInjectorExtensions.cs b/src/Nano.DependencyInjector/NanoDependencyInjectorExtensions.cs index d5b9567..3783529 100644 --- a/src/Nano.DependencyInjector/NanoDependencyInjectorExtensions.cs +++ b/src/Nano.DependencyInjector/NanoDependencyInjectorExtensions.cs @@ -34,7 +34,7 @@ private static object CreateInstance(IServiceProvider provider, Type type) object instance; ConstructorInfo publicConstructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, new[] {typeof(string)}, null); - + if (publicConstructor == null) { instance = System.Runtime.Serialization.FormatterServices diff --git a/tests/Nano.DependencyInjector.Tests/ListExtensionTests.cs b/tests/Nano.DependencyInjector.Tests/ListExtensionTests.cs index dc3d79b..88517f8 100644 --- a/tests/Nano.DependencyInjector.Tests/ListExtensionTests.cs +++ b/tests/Nano.DependencyInjector.Tests/ListExtensionTests.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using Xunit; @@ -10,14 +11,32 @@ public void TrueFunc_Should_Get_Items_When_Statement_Is_True() { var falseHeroes = new List(); var heroes = new List() {"Conan", "Spawn", "Batman"}; - heroes.If(IsBestHero) + heroes.If(IsThisTheBestHero) .True(t => Assert.Equal("Conan", t)) .False(f => falseHeroes.Add(f)); Assert.Equal(2, falseHeroes.Count); } - private bool IsBestHero(string hero) + [Fact] + public void There_Can_Be_Only_True_Action() + { + bool called = false; + + void TrueAct(string t) + { + called = true; + } + + var heroes = new List() {"Conan", "Spawn", "Batman"}; + heroes.If(IsThisTheBestHero) + .True(TrueAct) + .Run(); + + Assert.True(called); + } + + private bool IsThisTheBestHero(string hero) { return hero == "Conan"; }