diff --git a/src/ObjectBuilder/Policies/ResolveMappingPolicy.cs b/src/ObjectBuilder/Policies/ResolveMappingPolicy.cs new file mode 100644 index 000000000..5de0f95fc --- /dev/null +++ b/src/ObjectBuilder/Policies/ResolveMappingPolicy.cs @@ -0,0 +1,20 @@ +using Unity.Builder; +using Unity.Policy; + +namespace Unity.ObjectBuilder.Policies +{ + public class ResolveMappingPolicy : BuildKeyMappingPolicy, IDependencyResolverPolicy + { + public ResolveMappingPolicy(NamedTypeBuildKey newBuildKey) + : base(newBuildKey) + { + + } + + public object Resolve(IBuilderContext context) + { + return context.NewBuildUp(Map(context.BuildKey, context)); + + } + } +} diff --git a/src/ObjectBuilder/Strategies/BuildKeyMappingStrategy.cs b/src/ObjectBuilder/Strategies/BuildKeyMappingStrategy.cs index 6b05356e2..9dc7dc4d4 100644 --- a/src/ObjectBuilder/Strategies/BuildKeyMappingStrategy.cs +++ b/src/ObjectBuilder/Strategies/BuildKeyMappingStrategy.cs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. -using System; using Unity.Builder; using Unity.Builder.Strategy; -using Unity.Lifetime; using Unity.Policy; namespace Unity.ObjectBuilder.Strategies @@ -21,22 +19,18 @@ public class BuildKeyMappingStrategy : BuilderStrategy public override void PreBuildUp(IBuilderContext context) { var policy = context.Policies.Get(context.BuildKey); + if (null == policy) return; - if (policy != null) - { - context.BuildKey = policy.Map(context.BuildKey, context); - } - if (context.BuildKey == context.OriginalBuildKey || - 0 < ((PolicyList)context.Policies).Count) return; - - ILifetimePolicy lifetimePolicy = context.Policies.Get(context.BuildKey, out _); - var existing = lifetimePolicy?.GetValue(); + var existing = (policy as IDependencyResolverPolicy)?.Resolve(context); if (existing != null) { context.Existing = existing; context.BuildComplete = true; + return; } + + context.BuildKey = policy.Map(context.BuildKey, context); } } } diff --git a/src/UnityContainer.cs b/src/UnityContainer.cs index 29fb4fe5b..8c3bfa6e2 100644 --- a/src/UnityContainer.cs +++ b/src/UnityContainer.cs @@ -16,7 +16,6 @@ using Unity.Policy; using Unity.Registration; using Unity.Resolution; -using Unity.ResolverPolicy; namespace Unity { @@ -86,8 +85,11 @@ public IUnityContainer RegisterType(Type typeFrom, Type typeTo, string name, Lif } else { - _policies.Set(new BuildKeyMappingPolicy(new NamedTypeBuildKey(to, name)), - new NamedTypeBuildKey(typeFrom, name)); + var policy = (null != injectionMembers && injectionMembers.Length > 0) || lifetimeManager is IRequireBuildUpPolicy + ? new BuildKeyMappingPolicy(new NamedTypeBuildKey(to, name)) + : new ResolveMappingPolicy(new NamedTypeBuildKey(to, name)); + + _policies.Set(policy, new NamedTypeBuildKey(typeFrom, name)); } } if (lifetimeManager != null) diff --git a/tests/Unity.Tests/CodeplexIssuesFixture.cs b/tests/Unity.Tests/CodeplexIssuesFixture.cs index 695ff63b5..10f6a6ce3 100644 --- a/tests/Unity.Tests/CodeplexIssuesFixture.cs +++ b/tests/Unity.Tests/CodeplexIssuesFixture.cs @@ -51,16 +51,14 @@ public void CanUseNonDefaultLifetimeManagerWithOpenGenericRegistration() public void CanOverrideGenericLifetimeManagerWithSpecificOne() { IUnityContainer container = new UnityContainer() - .RegisterType(typeof(ISomeInterface<>), - typeof(MyTypeImplementingSomeInterface<>), - new ContainerControlledLifetimeManager()) + .RegisterType(typeof(ISomeInterface<>), typeof(MyTypeImplementingSomeInterface<>), new ContainerControlledLifetimeManager()) .RegisterType(typeof(MyTypeImplementingSomeInterface), new TransientLifetimeManager()); ISomeInterface string1 = container.Resolve>(); ISomeInterface string2 = container.Resolve>(); - ISomeInterface double1 = container.Resolve>(); - ISomeInterface double2 = container.Resolve>(); + var double1 = container.Resolve>(); + var double2 = container.Resolve>(); Assert.AreSame(string1, string2); Assert.AreNotSame(double1, double2); diff --git a/tests/Unity.Tests/GitHubIssues.cs b/tests/Unity.Tests/GitHubIssues.cs index 58e338a86..351c6a722 100644 --- a/tests/Unity.Tests/GitHubIssues.cs +++ b/tests/Unity.Tests/GitHubIssues.cs @@ -4,7 +4,9 @@ using Unity; using Unity.Attributes; using Unity.Exceptions; +using Unity.Injection; using Unity.Lifetime; +using Unity.Tests.TestObjects; using UnityContainer = Unity.UnityContainer; namespace GitHub @@ -12,6 +14,20 @@ namespace GitHub [TestClass] public class Issues { + + [TestMethod] + public void unity_154_5() + { + IUnityContainer container = new UnityContainer(); + container.RegisterType(new ContainerControlledLifetimeManager()); + container.RegisterType(); + container.RegisterType(new InjectionConstructor(container)); + + Assert.AreNotSame(container.Resolve(), + container.Resolve()); + } + + [TestMethod] public void unity_154() { @@ -20,7 +36,8 @@ public void unity_154() container.RegisterType(); container.RegisterType(); - Assert.AreSame(container.Resolve(), container.Resolve()); + Assert.AreSame(container.Resolve(), + container.Resolve()); } @@ -39,23 +56,23 @@ public void unity_153() } } - - -[TestMethod] -public void Issue_35() -{ - IUnityContainer container = new UnityContainer(); - container.RegisterType(new ContainerControlledLifetimeManager()); - ILogger logger = container.Resolve(); + [TestMethod] + public void Issue_35() + { + IUnityContainer container = new UnityContainer(); - Assert.IsNotNull(logger); - Assert.AreSame(container.Resolve(), logger); + container.RegisterType(new ContainerControlledLifetimeManager()); + ILogger logger = container.Resolve(); - container.RegisterType(new TransientLifetimeManager()); + Assert.IsNotNull(logger); + Assert.AreSame(container.Resolve(), logger); + + container.RegisterType(new TransientLifetimeManager()); + + Assert.AreSame(container.Resolve(), logger); + } - Assert.AreSame(container.Resolve(), logger); -} [TestMethod] public void GitHub_Issue_88() // https://github.com/unitycontainer/unity/issues/88 { diff --git a/tests/Unity.Tests/TestObjects/EmailService.cs b/tests/Unity.Tests/TestObjects/EmailService.cs index 7dd57c9b4..af03fae31 100644 --- a/tests/Unity.Tests/TestObjects/EmailService.cs +++ b/tests/Unity.Tests/TestObjects/EmailService.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System; +using Unity.Attributes; namespace Unity.Tests.TestObjects { @@ -19,6 +20,18 @@ public void Dispose() // A dummy class to support testing type mapping public class OtherEmailService : IService, IOtherService, IDisposable { + [InjectionConstructor] + public OtherEmailService() + { + + } + + public OtherEmailService(IUnityContainer container) + { + + } + + public bool Disposed = false; public void Dispose() {