@@ -6,30 +6,51 @@ namespace Bridge.Ioc
66{
77 public class TransientResolver : IResolver
88 {
9- public Func < object > Resolve { get ; set ; }
9+ private static Stack < Type > resolved = new Stack < Type > ( ) ;
10+ private static HashSet < Type > resolving = new HashSet < Type > ( ) ;
11+
12+ public Func < object > Resolve { get ; private set ; }
1013
1114 public TransientResolver ( IIoc ioc , Type toresolveType )
1215 {
13- this . Resolve = ( ) =>
16+ Resolve = ( ) =>
1417 {
1518 // get ctor
1619 var ctor = toresolveType . GetConstructors ( ) . FirstOrDefault ( ) ;
1720 if ( ctor == null )
1821 throw new Exception ( $ "No ctor found for type { toresolveType . FullName } !") ;
1922
20- // get ctor params
21- var ctorParams = ctor . GetParameters ( ) ;
22- if ( ! ctorParams . Any ( ) )
23- return Activator . CreateInstance ( toresolveType ) ;
24- else
23+ resolved . Push ( toresolveType ) ;
24+ if ( ! resolving . Add ( toresolveType ) )
25+ {
26+ var message = $ "Recursive error in type resolving { toresolveType . FullName } ! \n { string . Join ( " -> " , resolved . Reverse ( ) . Select ( a => a . FullName ) ) } ";
27+ resolved . Pop ( ) ;
28+ throw new Exception ( message ) ;
29+ }
30+
31+ try
2532 {
26- // recursive resolve
27- var parameters = new List < object > ( ctorParams . Length ) ;
33+ // get ctor params
34+ var ctorParams = ctor . GetParameters ( ) ;
35+ if ( ! ctorParams . Any ( ) )
36+ return Activator . CreateInstance ( toresolveType ) ;
37+ else
38+ {
39+ // recursive resolve
40+ var parameters = new List < object > ( ctorParams . Length ) ;
2841
29- foreach ( var parameterInfo in ctorParams )
30- parameters . Add ( ioc . Resolve ( parameterInfo . ParameterType ) ) ;
42+ foreach ( var parameterInfo in ctorParams )
43+ {
44+ parameters . Add ( ioc . Resolve ( parameterInfo . ParameterType ) ) ;
45+ }
3146
32- return ctor . Invoke ( parameters . ToArray ( ) ) ;
47+ return ctor . Invoke ( parameters . ToArray ( ) ) ;
48+ }
49+ }
50+ finally
51+ {
52+ resolved . Pop ( ) ;
53+ resolving . Remove ( toresolveType ) ;
3354 }
3455 } ;
3556 }
0 commit comments