From 6bdb33c1daf76c09fa000843ee8304582273aefb Mon Sep 17 00:00:00 2001 From: "joseph.bott" Date: Fri, 21 Oct 2016 09:31:50 -0500 Subject: [PATCH] Do not choose constructors with an "Obsolete" attribute --- .../Integration/ConstructorSelectionTests.cs | 30 +++++++++++++++++++ src/Ninject/INinjectSettings.cs | 5 ++++ src/Ninject/NinjectSettings.cs | 9 ++++++ .../ConstructorInjectionDirective.cs | 6 ++++ .../ConstructorReflectionStrategy.cs | 4 ++- .../Heuristics/StandardConstructorScorer.cs | 5 ++++ 6 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/Ninject.Test/Integration/ConstructorSelectionTests.cs b/src/Ninject.Test/Integration/ConstructorSelectionTests.cs index 3f9bb609..62930718 100644 --- a/src/Ninject.Test/Integration/ConstructorSelectionTests.cs +++ b/src/Ninject.Test/Integration/ConstructorSelectionTests.cs @@ -222,6 +222,18 @@ public void WhenConstructorHasAnOpenGenericTypeItCountsAsServedParameterIfBindin instance.Generic.Should().NotBeNull(); } + [Fact] + public void DoNotChooseObsoleteConstructors() + { + kernel.Bind().ToSelf(); + + var instance = kernel.Get(); + + instance.Should().NotBeNull(); + instance.SomeObject.Should().NotBeNull(); + instance.ObsoleteConstructorCalled.Should().Be(false); + } + #if !SILVERLIGHT [Fact] public void WhenConstructorHasAValueWithDefaultValueItCountsAsServedParameter() @@ -286,5 +298,23 @@ public ClassWithTwoInjectAttributes(int someValue) { } } + + public class ClassWithObsoleteContructor + { + [Obsolete("Use Ninject to create an instance")] + public ClassWithObsoleteContructor() + : this(new object()) + { + ObsoleteConstructorCalled = true; + } + + public ClassWithObsoleteContructor(Object someObject) + { + SomeObject = someObject; + } + + public Object SomeObject { get; set; } + public bool ObsoleteConstructorCalled { get; set; } + } } } \ No newline at end of file diff --git a/src/Ninject/INinjectSettings.cs b/src/Ninject/INinjectSettings.cs index 6239e470..8797d4e4 100644 --- a/src/Ninject/INinjectSettings.cs +++ b/src/Ninject/INinjectSettings.cs @@ -36,6 +36,11 @@ public interface INinjectSettings /// Type InjectAttribute { get; } + /// + /// Gets the attribute that indicates that a member is obsolete and should not be injected. + /// + Type ObsoleteAttribute { get; } + /// /// Gets the interval at which the cache should be pruned. /// diff --git a/src/Ninject/NinjectSettings.cs b/src/Ninject/NinjectSettings.cs index 96a1513c..4b219bfd 100644 --- a/src/Ninject/NinjectSettings.cs +++ b/src/Ninject/NinjectSettings.cs @@ -64,6 +64,15 @@ public Type InjectAttribute set { this.Set("InjectAttribute", value); } } + /// + /// Gets or sets the attribute that indicates that a member is obsolete and should not be injected. + /// + public Type ObsoleteAttribute + { + get { return this.Get("ObsoleteAttribute", typeof(ObsoleteAttribute)); } + set { this.Set("ObsoleteAttribute", value); } + } + /// /// Gets or sets the interval at which the GC should be polled. /// diff --git a/src/Ninject/Planning/Directives/ConstructorInjectionDirective.cs b/src/Ninject/Planning/Directives/ConstructorInjectionDirective.cs index 520b6994..942ca075 100644 --- a/src/Ninject/Planning/Directives/ConstructorInjectionDirective.cs +++ b/src/Ninject/Planning/Directives/ConstructorInjectionDirective.cs @@ -51,5 +51,11 @@ public ConstructorInjectionDirective(ConstructorInfo constructor, ConstructorInj /// /// true if this constructor has an inject attribute; otherwise, false. public bool HasInjectAttribute { get; set; } + + /// + /// Gets or sets a value indicating whether this constructor has an Obsolete attribute. + /// + /// true if this constructor has an Obsolete attribute; otherwise, false. + public bool HasObsoleteAttribute { get; set; } } } \ No newline at end of file diff --git a/src/Ninject/Planning/Strategies/ConstructorReflectionStrategy.cs b/src/Ninject/Planning/Strategies/ConstructorReflectionStrategy.cs index f20305ab..4a1d6cc0 100644 --- a/src/Ninject/Planning/Strategies/ConstructorReflectionStrategy.cs +++ b/src/Ninject/Planning/Strategies/ConstructorReflectionStrategy.cs @@ -72,9 +72,11 @@ public void Execute(IPlan plan) foreach (ConstructorInfo constructor in constructors) { var hasInjectAttribute = constructor.HasAttribute(this.Settings.InjectAttribute); + var hasObsoleteAttribute = constructor.HasAttribute(this.Settings.ObsoleteAttribute); var directive = new ConstructorInjectionDirective(constructor, this.InjectorFactory.Create(constructor)) { - HasInjectAttribute = hasInjectAttribute + HasInjectAttribute = hasInjectAttribute, + HasObsoleteAttribute = hasObsoleteAttribute }; plan.Add(directive); diff --git a/src/Ninject/Selection/Heuristics/StandardConstructorScorer.cs b/src/Ninject/Selection/Heuristics/StandardConstructorScorer.cs index 17849745..31548d8e 100644 --- a/src/Ninject/Selection/Heuristics/StandardConstructorScorer.cs +++ b/src/Ninject/Selection/Heuristics/StandardConstructorScorer.cs @@ -57,6 +57,11 @@ public virtual int Score(IContext context, ConstructorInjectionDirective directi return int.MaxValue; } + if (directive.HasObsoleteAttribute) + { + return int.MinValue; + } + var score = 1; foreach (ITarget target in directive.Targets) {