Skip to content

Commit b6a7a22

Browse files
author
d.popov
committed
Throw error when recurcive resolving + stack
Removed setter in Resolve func
1 parent d0ac9bd commit b6a7a22

File tree

5 files changed

+38
-17
lines changed

5 files changed

+38
-17
lines changed

Bridge.Ioc/Abstract/IResolver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ namespace Bridge.Ioc
44
{
55
public interface IResolver
66
{
7-
Func<object> Resolve { get; set; }
7+
Func<object> Resolve { get; }
88
}
99
}

Bridge.Ioc/Resolvers/FuncResolver.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ namespace Bridge.Ioc
44
{
55
public class FuncResolver<T> : IResolver
66
{
7-
public Func<object> Resolve { get; set; }
7+
public Func<object> Resolve { get; private set; }
88

99
public FuncResolver(Func<T> resolveFunc)
1010
{
11-
this.Resolve = () => resolveFunc();
11+
Resolve = () => resolveFunc();
1212
}
1313
}
1414
}

Bridge.Ioc/Resolvers/InstanceResolver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ namespace Bridge.Ioc
44
{
55
public class InstanceResolver : IResolver
66
{
7-
public Func<object> Resolve { get; set; }
7+
public Func<object> Resolve { get; private set; }
88

99
public InstanceResolver(object resolvedObj)
1010
{

Bridge.Ioc/Resolvers/SingleInstanceResolver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public class SingleInstanceResolver : IResolver
66
{
77
private object _singleInstance;
88

9-
public Func<object> Resolve { get; set; }
9+
public Func<object> Resolve { get; private set; }
1010

1111
public SingleInstanceResolver(IIoc ioc, Type type)
1212
{

Bridge.Ioc/Resolvers/TransientResolver.cs

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)