Skip to content

Commit 5892504

Browse files
committed
Fixed #95, #96
1 parent 7dc38e9 commit 5892504

File tree

6 files changed

+76
-12
lines changed

6 files changed

+76
-12
lines changed

src/Strategies/ArrayResolveStrategy.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Reflection;
44
using Unity.Builder;
55
using Unity.Builder.Strategy;
6+
using Unity.Injection;
67
using Unity.ObjectBuilder.BuildPlan.DynamicMethod;
78
using Unity.Policy;
89
using Unity.Registration;
@@ -72,6 +73,13 @@ public override void PreBuildUp(IBuilderContext context)
7273

7374
public override bool RequiredToBuildType(IUnityContainer container, INamedType namedType, params InjectionMember[] injectionMembers)
7475
{
76+
if (namedType is ContainerRegistration containerRegistration)
77+
{
78+
if (containerRegistration.RegisteredType != containerRegistration.MappedToType ||
79+
null != injectionMembers && injectionMembers.Any(i => i is IInjectionFactory))
80+
return false;
81+
}
82+
7583
return namedType is InternalRegistration registration &&
7684
registration.Type.IsArray && registration.Type.GetArrayRank() == 1
7785
? true : false;

src/Strategies/EnumerableResolveStrategy.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Reflection;
55
using Unity.Builder;
66
using Unity.Builder.Strategy;
7+
using Unity.Injection;
78
using Unity.ObjectBuilder.BuildPlan.DynamicMethod;
89
using Unity.Policy;
910
using Unity.Registration;
@@ -72,6 +73,13 @@ public override void PreBuildUp(IBuilderContext context)
7273

7374
public override bool RequiredToBuildType(IUnityContainer container, INamedType namedType, params InjectionMember[] injectionMembers)
7475
{
76+
if (namedType is ContainerRegistration containerRegistration)
77+
{
78+
if (containerRegistration.RegisteredType != containerRegistration.MappedToType ||
79+
null != injectionMembers && injectionMembers.Any(i => i is IInjectionFactory))
80+
return false;
81+
}
82+
7583
return namedType is InternalRegistration registration &&
7684
registration.Type.GetTypeInfo().IsGenericType &&
7785
typeof(IEnumerable<>) == registration.Type.GetGenericTypeDefinition();

tests/Unity.Tests/CollectionSupport/CollectionSupportFixture.cs

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using Microsoft.Practices.Unity;
44
using Microsoft.VisualStudio.TestTools.UnitTesting;
5+
using Unity.Injection;
56
using Unity.Lifetime;
67

78

@@ -10,12 +11,58 @@ namespace Unity.Tests.CollectionSupport
1011
[TestClass]
1112
public class CollectionSupportFixture
1213
{
14+
[TestMethod]
15+
public void ResolvingEnumTypeSucceedsIfItWasNotRegistered()
16+
{
17+
IUnityContainer container = new UnityContainer();
18+
19+
Assert.IsNotNull(container.Resolve<IEnumerable<TestClass>>());
20+
}
21+
22+
1323
[TestMethod]
1424
public void ResolvingAnArrayTypeSucceedsIfItWasNotRegistered()
1525
{
1626
IUnityContainer container = new UnityContainer();
1727

18-
TestClass[] resolved = container.Resolve<TestClass[]>();
28+
Assert.IsNotNull(container.Resolve<TestClass[]>());
29+
}
30+
31+
[TestMethod]
32+
public void ResolvingAnArrayWithFactory()
33+
{
34+
var name = "test";
35+
var data = new [] { new TestClass(), new TestClass() };
36+
37+
var container = new UnityContainer()
38+
.RegisterType<TestClass[]>(new InjectionFactory(c => data))
39+
.RegisterType<TestClass[]>(name, new InjectionFactory(c => data));
40+
41+
Assert.AreSame(data, container.Resolve<TestClass[]>());
42+
Assert.AreSame(data, container.Resolve<TestClass[]>(name));
43+
}
44+
45+
[TestMethod]
46+
public void ResolvingEnumWithFactory()
47+
{
48+
var name = "test";
49+
var data = new [] { new TestClass(), new TestClass() };
50+
51+
var container = new UnityContainer()
52+
.RegisterType<IEnumerable<TestClass>>(new InjectionFactory(c => data))
53+
.RegisterType<IEnumerable<TestClass>>(name, new InjectionFactory(c => data));
54+
55+
Assert.AreSame(data, container.Resolve<IEnumerable<TestClass>>());
56+
Assert.AreSame(data, container.Resolve<IEnumerable<TestClass>>(name));
57+
}
58+
59+
[TestMethod]
60+
public void ResolvingEnumWithMap()
61+
{
62+
var container = new UnityContainer()
63+
.RegisterType<IEnumerable<TestClass>, List<TestClass>>(new InjectionConstructor());
64+
65+
Assert.IsInstanceOfType(container.Resolve<IEnumerable<TestClass>>(), typeof(List<TestClass>));
1966
}
2067

2168
[TestMethod]

tests/Unity.Tests/Container/ContainerBasicFixture.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,6 @@ public void ResolveListAtest()
148148
AssertHelper.ThrowsException<ResolutionFailedException>(() => uc1.Resolve<List<ATest>>("List"));
149149
}
150150

151-
[TestMethod]
152-
public void ResolveArrayOfAtest()
153-
{
154-
UnityContainer uc1 = new UnityContainer();
155-
156-
uc1.RegisterType<ATest[]>("Array");
157-
ATest[] arr = (ATest[])uc1.Resolve<ATest[]>("Array");
158-
}
159-
160151
#region Basic Parameterized Constructor
161152

162153
[TestMethod]

tests/Unity.Tests/Lifetime/LifetimeFixture.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,9 @@ public void SetSingletonDefaultNameRegisterInstance()
295295
IUnityContainer uc = new UnityContainer();
296296

297297
var aInstance = new EmailService();
298-
uc.RegisterType(null, typeof(EmailService), null, new ContainerControlledLifetimeManager(), null);
299-
uc.RegisterType<EmailService>("SetA", new ContainerControlledLifetimeManager());
298+
299+
uc.RegisterType(null, typeof(EmailService), null, new ContainerControlledLifetimeManager(), null);
300+
uc.RegisterType(null, typeof(EmailService), "SetA", new ContainerControlledLifetimeManager(), null);
300301
uc.RegisterInstance(aInstance);
301302
uc.RegisterInstance("hello", aInstance);
302303
uc.RegisterInstance("hello", aInstance, new ExternallyControlledLifetimeManager());

tests/Unity.Tests/ResolvingArraysFixture.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@ public void ContainerCanResolveListOfT()
3333
Assert.IsNotNull(result);
3434
}
3535

36+
[TestMethod]
37+
public void ResolveArrayOfAtest()
38+
{
39+
UnityContainer uc1 = new UnityContainer();
40+
41+
uc1.RegisterType<EmptyClass[]>("Array");
42+
Assert.IsNotNull(uc1.Resolve<EmptyClass[]>("Array"));
43+
}
44+
3645
[TestMethod]
3746
public void ContainerReturnsEmptyArrayIfNoObjectsRegistered()
3847
{

0 commit comments

Comments
 (0)