@@ -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