Skip to content

Commit 47a7c5d

Browse files
committed
avoid creating composite overrides that would be discarded immediately
1 parent 70d0170 commit 47a7c5d

File tree

1 file changed

+45
-13
lines changed

1 file changed

+45
-13
lines changed

source/Unity/Src/ObjectBuilder/BuilderContext.cs

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ public class BuilderContext : IBuilderContext
1919
readonly NamedTypeBuildKey originalBuildKey;
2020
private readonly IPolicyList persistentPolicies;
2121
readonly IPolicyList policies;
22-
private CompositeResolverOverride resolverOverrides = new CompositeResolverOverride();
22+
private CompositeResolverOverride resolverOverrides;
23+
private bool ownsOverrides;
2324

2425
/// <summary>
2526
/// Initialize a new instance of the <see cref="BuilderContext"/> class.
@@ -49,6 +50,8 @@ public BuilderContext(IStrategyChain chain,
4950
this.persistentPolicies = policies;
5051
this.policies = new PolicyList(persistentPolicies);
5152
this.Existing = existing;
53+
this.resolverOverrides = new CompositeResolverOverride();
54+
this.ownsOverrides = true;
5255
}
5356

5457
/// <summary>
@@ -72,6 +75,33 @@ public BuilderContext(IStrategyChain chain, ILifetimeContainer lifetime, IPolicy
7275
this.originalBuildKey = buildKey;
7376
this.BuildKey = buildKey;
7477
this.Existing = existing;
78+
this.resolverOverrides = new CompositeResolverOverride();
79+
this.ownsOverrides = true;
80+
}
81+
82+
/// <summary>
83+
/// Create a new <see cref="BuilderContext"/> using the explicitly provided
84+
/// values.
85+
/// </summary>
86+
/// <param name="chain">The <see cref="IStrategyChain"/> to use for this context.</param>
87+
/// <param name="lifetime">The <see cref="ILifetimeContainer"/> to use for this context.</param>
88+
/// <param name="persistentPolicies">The set of persistent policies to use for this context.</param>
89+
/// <param name="transientPolicies">The set of transient policies to use for this context. It is
90+
/// the caller's responsibility to ensure that the transient and persistent policies are properly
91+
/// combined.</param>
92+
/// <param name="buildKey">Build key for this context.</param>
93+
/// <param name="resolverOverrides">The resolver overrides.</param>
94+
protected BuilderContext(IStrategyChain chain, ILifetimeContainer lifetime, IPolicyList persistentPolicies, IPolicyList transientPolicies, NamedTypeBuildKey buildKey, CompositeResolverOverride resolverOverrides)
95+
{
96+
this.chain = chain;
97+
this.lifetime = lifetime;
98+
this.persistentPolicies = persistentPolicies;
99+
this.policies = transientPolicies;
100+
this.originalBuildKey = buildKey;
101+
this.BuildKey = buildKey;
102+
this.Existing = null;
103+
this.resolverOverrides = resolverOverrides;
104+
this.ownsOverrides = false;
75105
}
76106

77107
/// <summary>
@@ -180,6 +210,14 @@ public IRecoveryStack RecoveryStack
180210
/// <param name="newOverrides"><see cref="ResolverOverride"/> objects to add.</param>
181211
public void AddResolverOverrides(IEnumerable<ResolverOverride> newOverrides)
182212
{
213+
if (!this.ownsOverrides)
214+
{
215+
var sharedOverrides = this.resolverOverrides;
216+
this.resolverOverrides = new CompositeResolverOverride();
217+
this.resolverOverrides.AddRange(sharedOverrides);
218+
this.ownsOverrides = true;
219+
}
220+
183221
resolverOverrides.AddRange(newOverrides);
184222
}
185223

@@ -204,10 +242,7 @@ public IDependencyResolverPolicy GetOverriddenResolver(Type dependencyType)
204242
public object NewBuildUp(NamedTypeBuildKey newBuildKey)
205243
{
206244
this.ChildContext =
207-
new BuilderContext(chain, lifetime, persistentPolicies, policies, newBuildKey, null)
208-
{
209-
resolverOverrides = this.resolverOverrides
210-
};
245+
new BuilderContext(chain, lifetime, persistentPolicies, policies, newBuildKey, this.resolverOverrides);
211246

212247
object result = this.ChildContext.Strategies.ExecuteBuildUp(this.ChildContext);
213248

@@ -231,17 +266,14 @@ public object NewBuildUp(NamedTypeBuildKey newBuildKey, Action<IBuilderContext>
231266
{
232267
Guard.ArgumentNotNull(childCustomizationBlock, "childCustomizationBlock");
233268

234-
ChildContext =
235-
new BuilderContext(chain, lifetime, persistentPolicies, policies, newBuildKey, null)
236-
{
237-
resolverOverrides = this.resolverOverrides
238-
};
269+
this.ChildContext =
270+
new BuilderContext(chain, lifetime, persistentPolicies, policies, newBuildKey, this.resolverOverrides);
239271

240-
childCustomizationBlock(ChildContext);
272+
childCustomizationBlock(this.ChildContext);
241273

242-
object result = ChildContext.Strategies.ExecuteBuildUp(ChildContext);
274+
object result = this.ChildContext.Strategies.ExecuteBuildUp(this.ChildContext);
243275

244-
ChildContext = null;
276+
this.ChildContext = null;
245277

246278
return result;
247279
}

0 commit comments

Comments
 (0)