diff --git a/src/TinyIoC/TinyIoC.cs b/src/TinyIoC/TinyIoC.cs index 85ca9be..e4a0142 100644 --- a/src/TinyIoC/TinyIoC.cs +++ b/src/TinyIoC/TinyIoC.cs @@ -3582,7 +3582,7 @@ where localType.IsAssignableFrom(implementationType) } // TODO - find a better way to remove "system" assemblies from the auto registration - private readonly List> ignoredAssemlies = new List>() + private static readonly IReadOnlyList> ignoredAssemlies = new List>() { asm => asm.FullName.StartsWith("Microsoft.", StringComparison.Ordinal), asm => asm.FullName.StartsWith("System.", StringComparison.Ordinal), @@ -3604,9 +3604,9 @@ private bool IsIgnoredAssembly(Assembly assembly) return false; } - + // TODO - find a better way to remove "system" types from the auto registration - private readonly List> ignoreChecks = new List>() + private static readonly IReadOnlyList> ignoreChecks = new List>() { t => t.FullName.StartsWith("System.", StringComparison.Ordinal), t => t.FullName.StartsWith("Microsoft.", StringComparison.Ordinal), @@ -3619,19 +3619,10 @@ private bool IsIgnoredAssembly(Assembly assembly) private bool IsIgnoredType(Type type, Func registrationPredicate) { - if (registrationPredicate != null && !registrationPredicate(type)) - { - ignoreChecks.Add(t => !registrationPredicate(t)); + if (ignoreChecks.Any(c => c(type))) return true; - } - for (int i = 0; i < ignoreChecks.Count; i++) - { - if (ignoreChecks[i](type)) - return true; - } - - return false; + return registrationPredicate != null && !registrationPredicate(type); } private void RegisterDefaultTypes() diff --git a/tests/TinyIoC.Tests/TinyIoCTests.cs b/tests/TinyIoC.Tests/TinyIoCTests.cs index 748584f..a5af444 100644 --- a/tests/TinyIoC.Tests/TinyIoCTests.cs +++ b/tests/TinyIoC.Tests/TinyIoCTests.cs @@ -3393,6 +3393,20 @@ public void AutoRegister_TypeExcludedViaPredicate_FailsToResolveType() //Assert.IsInstanceOfType(result, typeof(TinyIoCResolutionException)); } + [TestMethod] + public void AutoRegister_Resolve_MultipleCalls() + { + var container = UtilityMethods.GetContainer(); + + container.AutoRegister(new[] { this.GetType().Assembly }, t => typeof(ITestInterface).IsAssignableFrom(t)); + Assert.IsNotNull(container.Resolve()); + AssertHelper.ThrowsException(() => container.Resolve()); + + container.AutoRegister(new[] { this.GetType().Assembly }, t => typeof(ITestInterface2).IsAssignableFrom(t)); + Assert.IsNotNull(container.Resolve()); + Assert.IsNotNull(container.Resolve()); + } + #if RESOLVE_OPEN_GENERICS [TestMethod] public void Register_OpenGeneric_DoesNotThrow()