From 93eac2a7e44fc01b1daa0fb167c48ed53ab81405 Mon Sep 17 00:00:00 2001 From: Peter Csajtai Date: Tue, 2 May 2017 17:38:28 +0200 Subject: [PATCH] Refactor --- src/stashbox/Resolution/ResolverSelector.cs | 19 ++++++++++++++----- src/stashbox/StashboxContainer.cs | 10 ++++------ src/stashbox/Utils/HashMap.cs | 7 ++----- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/stashbox/Resolution/ResolverSelector.cs b/src/stashbox/Resolution/ResolverSelector.cs index be8f12e2..09139f72 100644 --- a/src/stashbox/Resolution/ResolverSelector.cs +++ b/src/stashbox/Resolution/ResolverSelector.cs @@ -3,16 +3,21 @@ using Stashbox.Infrastructure.Resolution; using Stashbox.Utils; using System.Linq.Expressions; +using Stashbox.BuildUp.Resolution; namespace Stashbox.Resolution { internal class ResolverSelector : IResolverSelector { private readonly ConcurrentOrderedStore resolverRepository; + private readonly UnknownTypeResolver unknownTypeResolver; + private readonly ParentContainerResolver parentContainerResolver; public ResolverSelector() { this.resolverRepository = new ConcurrentOrderedStore(); + this.unknownTypeResolver = new UnknownTypeResolver(); + this.parentContainerResolver = new ParentContainerResolver(); } public bool CanResolve(IContainerContext containerContext, TypeInformation typeInfo) @@ -21,31 +26,35 @@ public bool CanResolve(IContainerContext containerContext, TypeInformation typeI if (this.resolverRepository.Get(i).CanUseForResolution(containerContext, typeInfo)) return true; - return false; + return this.parentContainerResolver.CanUseForResolution(containerContext, typeInfo) || + this.unknownTypeResolver.CanUseForResolution(containerContext, typeInfo); } public Expression GetResolverExpression(IContainerContext containerContext, TypeInformation typeInfo, ResolutionInfo resolutionInfo) { - for (int i = 0; i < this.resolverRepository.Lenght; i++) + for (var i = 0; i < this.resolverRepository.Lenght; i++) { var item = this.resolverRepository.Get(i); if (item.CanUseForResolution(containerContext, typeInfo)) return item.GetExpression(containerContext, typeInfo, resolutionInfo); } - return null; + if (this.parentContainerResolver.CanUseForResolution(containerContext, typeInfo)) + return this.parentContainerResolver.GetExpression(containerContext, typeInfo, resolutionInfo); + + return this.unknownTypeResolver.CanUseForResolution(containerContext, typeInfo) ? this.unknownTypeResolver.GetExpression(containerContext, typeInfo, resolutionInfo) : null; } public Expression[] GetResolverExpressions(IContainerContext containerContext, TypeInformation typeInfo, ResolutionInfo resolutionInfo) { - for (int i = 0; i < this.resolverRepository.Lenght; i++) + for (var i = 0; i < this.resolverRepository.Lenght; i++) { var item = this.resolverRepository.Get(i); if (item.SupportsMany && item.CanUseForResolution(containerContext, typeInfo)) return item.GetExpressions(containerContext, typeInfo, resolutionInfo); } - return null; + return this.parentContainerResolver.CanUseForResolution(containerContext, typeInfo) ? this.parentContainerResolver.GetExpressions(containerContext, typeInfo, resolutionInfo) : null; } public void AddResolver(Resolver resolver) => diff --git a/src/stashbox/StashboxContainer.cs b/src/stashbox/StashboxContainer.cs index 763d3bcc..0023e7ce 100644 --- a/src/stashbox/StashboxContainer.cs +++ b/src/stashbox/StashboxContainer.cs @@ -41,7 +41,7 @@ public StashboxContainer(Action config = null) config?.Invoke(configurator); this.registrationRepository = new RegistrationRepository(); - this.ContainerContext = new ContainerContext(this.registrationRepository, new DelegateRepository(), this, + this.ContainerContext = new ContainerContext(this.registrationRepository, new DelegateRepository(), this, new ResolutionStrategy(this.resolverSelector), configurator, new DecoratorRepository()); this.activationContext = new Resolution.ActivationContext(this.ContainerContext, this.resolverSelector, this); this.expressionBuilder = new ExpressionBuilder(this.ContainerContext, this.containerExtensionManager); @@ -58,8 +58,8 @@ internal StashboxContainer(IStashboxContainer parentContainer, IContainerExtensi this.containerExtensionManager = containerExtensionManager; this.resolverSelector = resolverSelector; this.registrationRepository = new RegistrationRepository(); - this.ContainerContext = new ContainerContext(this.registrationRepository, new DelegateRepository(), this, - new ResolutionStrategy(this.resolverSelector), parentContainer.ContainerContext.ContainerConfigurator, + this.ContainerContext = new ContainerContext(this.registrationRepository, new DelegateRepository(), this, + new ResolutionStrategy(this.resolverSelector), parentContainer.ContainerContext.ContainerConfigurator, parentContainer.ContainerContext.DecoratorRepository); this.activationContext = new Resolution.ActivationContext(this.ContainerContext, this.resolverSelector, this); this.containerExtensionManager.ReinitalizeExtensions(this.ContainerContext); @@ -67,7 +67,7 @@ internal StashboxContainer(IStashboxContainer parentContainer, IContainerExtensi this.objectBuilderSelector = new ObjectBuilderSelector(this.ContainerContext, this.expressionBuilder); this.ServiceRegistrator = new ServiceRegistrator(this.ContainerContext, this.containerExtensionManager, this.objectBuilderSelector); } - + /// public void RegisterExtension(IContainerExtension containerExtension) { @@ -122,8 +122,6 @@ private void RegisterResolvers() this.resolverSelector.AddResolver(new FuncResolver()); this.resolverSelector.AddResolver(new TupleResolver()); this.resolverSelector.AddResolver(new DefaultValueResolver()); - this.resolverSelector.AddResolver(new UnknownTypeResolver()); - this.resolverSelector.AddResolver(new ParentContainerResolver()); } /// diff --git a/src/stashbox/Utils/HashMap.cs b/src/stashbox/Utils/HashMap.cs index d34f8f1e..8f62c592 100644 --- a/src/stashbox/Utils/HashMap.cs +++ b/src/stashbox/Utils/HashMap.cs @@ -26,11 +26,8 @@ public TValue GetOrDefault(TKey key) while (!tree.IsEmpty && tree.StoredHash != hash) tree = hash < tree.StoredHash ? tree.LeftNode : tree.RightNode; - - if (!tree.IsEmpty && (ReferenceEquals(key, tree.StoredKey) || key.Equals(tree.StoredKey))) - return tree.Value; - - return tree.Collisions.GetOrDefault(key); + return !tree.IsEmpty && (ReferenceEquals(key, tree.StoredKey) || key.Equals(tree.StoredKey)) ? + tree.Value : tree.Collisions.GetOrDefault(key); } [MethodImpl(Constants.Inline)]