33using System . Reflection ;
44using System . Runtime . CompilerServices ;
55using System . Security ;
6+ using Unity . Exceptions ;
67using Unity . Lifetime ;
78using Unity . Policy ;
89using Unity . Registration ;
@@ -24,6 +25,7 @@ public struct BuilderContext : IResolveContext
2425 public IPolicyList List ;
2526
2627 public delegate object ExecutePlanDelegate ( BuilderStrategy [ ] chain , ref BuilderContext context ) ;
28+ public delegate object ResolvePlanDelegate ( ref BuilderContext context , ResolveDelegate < BuilderContext > resolver ) ;
2729
2830 #endregion
2931
@@ -57,7 +59,7 @@ public object Resolve(Type type, string name)
5759 {
5860 var context = this ;
5961
60- return resolverPolicy . Resolve ( ref context ) ;
62+ return ResolvePlan ( ref context , resolverPolicy . Resolve ) ;
6163 }
6264 }
6365 }
@@ -127,6 +129,8 @@ public void Clear(Type type, string name, Type policyInterface)
127129#endif
128130 public ExecutePlanDelegate ExecutePlan ;
129131
132+ public ResolvePlanDelegate ResolvePlan ;
133+
130134 #endregion
131135
132136
@@ -145,6 +149,7 @@ public object Resolve(Type type, string name, InternalRegistration registration)
145149 Name = name ,
146150 Type = registration is ContainerRegistration containerRegistration ? containerRegistration . Type : type ,
147151 ExecutePlan = ExecutePlan ,
152+ ResolvePlan = ResolvePlan ,
148153 List = List ,
149154 Overrides = Overrides ,
150155 DeclaringType = Type ,
@@ -175,14 +180,14 @@ public object Resolve(ParameterInfo parameter, object value)
175180 // Check if itself is a value
176181 if ( resolverOverride is IResolve resolverPolicy )
177182 {
178- return resolverPolicy . Resolve ( ref context ) ;
183+ return ResolvePlan ( ref context , resolverPolicy . Resolve ) ;
179184 }
180185
181186 // Try to create value
182187 var resolveDelegate = resolverOverride . GetResolver < BuilderContext > ( parameter . ParameterType ) ;
183188 if ( null != resolveDelegate )
184189 {
185- return resolveDelegate ( ref context ) ;
190+ return ResolvePlan ( ref context , resolveDelegate ) ;
186191 }
187192 }
188193 }
@@ -220,14 +225,14 @@ public object Resolve(PropertyInfo property, object value)
220225 // Check if itself is a value
221226 if ( resolverOverride is IResolve resolverPolicy )
222227 {
223- return resolverPolicy . Resolve ( ref context ) ;
228+ return ResolvePlan ( ref context , resolverPolicy . Resolve ) ;
224229 }
225230
226231 // Try to create value
227232 var resolveDelegate = resolverOverride . GetResolver < BuilderContext > ( property . PropertyType ) ;
228233 if ( null != resolveDelegate )
229234 {
230- return resolveDelegate ( ref context ) ;
235+ return ResolvePlan ( ref context , resolveDelegate ) ;
231236 }
232237 }
233238 }
@@ -240,8 +245,15 @@ public object Resolve(PropertyInfo property, object value)
240245 return Resolve ( property . PropertyType , dependencyAttribute . Name ) ;
241246
242247 case OptionalDependencyAttribute optionalAttribute :
243- try { return Resolve ( property . PropertyType , optionalAttribute . Name ) ; }
244- catch { return null ; }
248+ try
249+ {
250+ return Resolve ( property . PropertyType , optionalAttribute . Name ) ;
251+ }
252+ catch ( Exception ex )
253+ when ( ! ( ex . InnerException is CircularDependencyException ) )
254+ {
255+ return null ;
256+ }
245257
246258 case ResolveDelegate < BuilderContext > resolver :
247259 return resolver ( ref context ) ;
@@ -268,14 +280,14 @@ public object Resolve(FieldInfo field, object value)
268280 // Check if itself is a value
269281 if ( resolverOverride is IResolve resolverPolicy )
270282 {
271- return resolverPolicy . Resolve ( ref context ) ;
283+ return ResolvePlan ( ref context , resolverPolicy . Resolve ) ;
272284 }
273285
274286 // Try to create value
275287 var resolveDelegate = resolverOverride . GetResolver < BuilderContext > ( field . FieldType ) ;
276288 if ( null != resolveDelegate )
277289 {
278- return resolveDelegate ( ref context ) ;
290+ return ResolvePlan ( ref context , resolveDelegate ) ;
279291 }
280292 }
281293 }
@@ -288,8 +300,15 @@ public object Resolve(FieldInfo field, object value)
288300 return Resolve ( field . FieldType , dependencyAttribute . Name ) ;
289301
290302 case OptionalDependencyAttribute optionalAttribute :
291- try { return Resolve ( field . FieldType , optionalAttribute . Name ) ; }
292- catch { return null ; }
303+ try
304+ {
305+ return Resolve ( field . FieldType , optionalAttribute . Name ) ;
306+ }
307+ catch ( Exception ex )
308+ when ( ! ( ex . InnerException is CircularDependencyException ) )
309+ {
310+ return null ;
311+ }
293312
294313 case ResolveDelegate < BuilderContext > resolver :
295314 return resolver ( ref context ) ;
0 commit comments