Skip to content

Commit 6ad269d

Browse files
authored
Fix : ResolveMany (#128)
1 parent 591e8a0 commit 6ad269d

File tree

3 files changed

+54
-15
lines changed

3 files changed

+54
-15
lines changed

core/src/AspectCore.Core/Injector/ServiceCallSiteResolver.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ namespace AspectCore.Injector
1111
internal class ServiceCallSiteResolver
1212
{
1313
private readonly ConstructorCallSiteResolver _constructorCallSiteResolver;
14-
private readonly ConcurrentDictionary<ServiceDefinition, Func<IServiceResolver, object>> _resolvedCallSites;
14+
private readonly ConcurrentDictionary<ServiceDefinition, Func<ServiceResolver, object>> _resolvedCallSites;
1515
public ServiceCallSiteResolver(ServiceTable serviceTable)
1616
{
1717
_constructorCallSiteResolver = new ConstructorCallSiteResolver(serviceTable);
18-
_resolvedCallSites = new ConcurrentDictionary<ServiceDefinition, Func<IServiceResolver, object>>();
18+
_resolvedCallSites = new ConcurrentDictionary<ServiceDefinition, Func<ServiceResolver, object>>();
1919
}
2020

21-
internal Func<IServiceResolver, object> Resolve(ServiceDefinition service)
21+
internal Func<ServiceResolver, object> Resolve(ServiceDefinition service)
2222
{
2323
return _resolvedCallSites.GetOrAdd(service, ResolvePropertyInject);
2424
}
2525

26-
internal Func<IServiceResolver, object> ResolvePropertyInject(ServiceDefinition service)
26+
internal Func<ServiceResolver, object> ResolvePropertyInject(ServiceDefinition service)
2727
{
2828
var callSite = ResolveInternal(service);
2929
if (!service.RequiredPropertyInjection())
@@ -44,7 +44,7 @@ internal Func<IServiceResolver, object> ResolvePropertyInject(ServiceDefinition
4444
};
4545
}
4646

47-
internal Func<IServiceResolver, object> ResolveInternal(ServiceDefinition service)
47+
internal Func<ServiceResolver, object> ResolveInternal(ServiceDefinition service)
4848
{
4949
switch (service)
5050
{
@@ -65,40 +65,40 @@ internal Func<IServiceResolver, object> ResolveInternal(ServiceDefinition servic
6565
};
6666
}
6767

68-
private Func<IServiceResolver, object> ResolveManyEnumerableService(ManyEnumerableServiceDefintion manyEnumerableServiceDefintion)
68+
private Func<ServiceResolver, object> ResolveManyEnumerableService(ManyEnumerableServiceDefintion manyEnumerableServiceDefintion)
6969
{
70-
var elementResolvers = manyEnumerableServiceDefintion.ServiceDefinitions.Select(x => Resolve(x)).ToArray();
70+
var elementDefinitions = manyEnumerableServiceDefintion.ServiceDefinitions.ToArray();
7171
var elementType = manyEnumerableServiceDefintion.ElementType;
7272
return resolver =>
7373
{
74-
var length = elementResolvers.Length;
74+
var length = elementDefinitions.Length;
7575
var instance = Array.CreateInstance(elementType, length);
7676
for (var i = 0; i < length; i++)
7777
{
78-
instance.SetValue(elementResolvers[i](resolver), i);
78+
instance.SetValue(resolver.ResolveDefinition(elementDefinitions[i]), i);
7979
}
8080
return ActivatorUtils.CreateManyEnumerable(elementType, instance);
8181
};
8282
}
8383

84-
private Func<IServiceResolver, object> ResolveEnumerableService(EnumerableServiceDefintion enumerableServiceDefintion)
84+
private Func<ServiceResolver, object> ResolveEnumerableService(EnumerableServiceDefintion enumerableServiceDefintion)
8585
{
86-
var elementResolvers = enumerableServiceDefintion.ServiceDefinitions.Select(x => Resolve(x)).ToArray();
86+
var elementDefinitions = enumerableServiceDefintion.ServiceDefinitions.ToArray();
8787
var elementType = enumerableServiceDefintion.ElementType;
8888
return resolver =>
8989
{
90-
var length = elementResolvers.Length;
90+
var length = elementDefinitions.Length;
9191
var instance = Array.CreateInstance(elementType, length);
9292
for (var i = 0; i < length; i++)
9393
{
94-
var element = elementResolvers[i](resolver);
94+
var element = resolver.ResolveDefinition(elementDefinitions[i]);
9595
instance.SetValue(element, i);
9696
}
9797
return instance;
9898
};
9999
}
100100

101-
private Func<IServiceResolver, object> ResolveProxyService(ProxyServiceDefinition proxyServiceDefinition)
101+
private Func<ServiceResolver, object> ResolveProxyService(ProxyServiceDefinition proxyServiceDefinition)
102102
{
103103
if (proxyServiceDefinition.ServiceType.GetTypeInfo().IsClass)
104104
{
@@ -110,7 +110,7 @@ private Func<IServiceResolver, object> ResolveProxyService(ProxyServiceDefinitio
110110
return resolver => reflector.Invoke(resolver.ResolveRequired<IAspectActivatorFactory>(), serviceResolver(resolver));
111111
}
112112

113-
private Func<IServiceResolver, object> ResolveTypeService(TypeServiceDefinition typeServiceDefinition)
113+
private Func<ServiceResolver, object> ResolveTypeService(TypeServiceDefinition typeServiceDefinition)
114114
{
115115
var callSite = _constructorCallSiteResolver.Resolve(typeServiceDefinition.ImplementationType);
116116
if (callSite == null)

core/src/AspectCore.Core/Injector/ServiceResolver.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ public object Resolve(Type serviceType)
4646

4747
var definition = _serviceTable.TryGetService(serviceType);
4848

49+
return ResolveDefinition(definition);
50+
}
51+
52+
internal object ResolveDefinition(ServiceDefinition definition)
53+
{
4954
if (definition == null)
5055
{
5156
return null;

core/test/AspectCore.Tests/Injector/ManyEnumerableTest.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,40 @@ public void Resolve_Not_Register()
3434
Assert.NotNull(many);
3535
Assert.Equal(0, many.Count());
3636
}
37+
38+
[Fact]
39+
public void Resolve_Enumerable_Lifetime()
40+
{
41+
var many = ServiceResolver.Resolve<IEnumerable<IService>>().ToArray();
42+
var many1 = ServiceResolver.Resolve<IEnumerable<IService>>().ToArray();
43+
Assert.NotEqual(many[0], many1[0]);
44+
Assert.Equal(many[1], many1[1]);
45+
Assert.Equal(many[2], many1[2]);
46+
using (var scope = ServiceResolver.CreateScope())
47+
{
48+
var many2 = scope.Resolve<IEnumerable<IService>>().ToArray();
49+
Assert.NotEqual(many[0], many2[0]);
50+
Assert.Equal(many[1], many2[1]);
51+
Assert.NotEqual(many[2], many2[2]);
52+
}
53+
}
54+
55+
[Fact]
56+
public void Resolve_Many_Lifetime()
57+
{
58+
var many = ServiceResolver.ResolveMany<IService>().ToArray();
59+
var many1 = ServiceResolver.ResolveMany<IService>().ToArray();
60+
Assert.NotEqual(many[0], many1[0]);
61+
Assert.Equal(many[1], many1[1]);
62+
Assert.Equal(many[2], many1[2]);
63+
using (var scope = ServiceResolver.CreateScope())
64+
{
65+
var many2 = scope.Resolve<IEnumerable<IService>>().ToArray();
66+
Assert.NotEqual(many[0], many2[0]);
67+
Assert.Equal(many[1], many2[1]);
68+
Assert.NotEqual(many[2], many2[2]);
69+
}
70+
}
3771

3872
protected override void ConfigureService(IServiceContainer serviceContainer)
3973
{

0 commit comments

Comments
 (0)