Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
Peter Csajtai committed May 2, 2017
1 parent b9feb15 commit 93eac2a
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 16 deletions.
19 changes: 14 additions & 5 deletions src/stashbox/Resolution/ResolverSelector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Resolver> resolverRepository;
private readonly UnknownTypeResolver unknownTypeResolver;
private readonly ParentContainerResolver parentContainerResolver;

public ResolverSelector()
{
this.resolverRepository = new ConcurrentOrderedStore<Resolver>();
this.unknownTypeResolver = new UnknownTypeResolver();
this.parentContainerResolver = new ParentContainerResolver();
}

public bool CanResolve(IContainerContext containerContext, TypeInformation typeInfo)
Expand All @@ -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) =>
Expand Down
10 changes: 4 additions & 6 deletions src/stashbox/StashboxContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public StashboxContainer(Action<IContainerConfigurator> 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);
Expand All @@ -58,16 +58,16 @@ 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);
this.expressionBuilder = new ExpressionBuilder(this.ContainerContext, this.containerExtensionManager);
this.objectBuilderSelector = new ObjectBuilderSelector(this.ContainerContext, this.expressionBuilder);
this.ServiceRegistrator = new ServiceRegistrator(this.ContainerContext, this.containerExtensionManager, this.objectBuilderSelector);
}

/// <inheritdoc />
public void RegisterExtension(IContainerExtension containerExtension)
{
Expand Down Expand Up @@ -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());
}

/// <inheritdoc />
Expand Down
7 changes: 2 additions & 5 deletions src/stashbox/Utils/HashMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down

0 comments on commit 93eac2a

Please sign in to comment.