Zyklischer Abhängigkeitsfehler beim Dekorieren mit herkömmlichen Ninject 3.0-Bindungen
-
11-12-2019 - |
Frage
Bitte sehen Sie sich den Beispielcode unten an.Es ist ein übermäßig vereinfachtes Szenario, um ein Problem zu demonstrieren, auf das ich beim Binden mit dem stoße WhenInjectedInto
Methode.Dies hat mit der früheren Version von ninject immer funktioniert.Aber irgendwie kann ich mit diesem Upgrade auf 3.0 nicht sehen, wo das Problem liegt.Ich erhalte eine zyklische Abhängigkeitsausnahme (d. h.der Dekorateur wird in sich selbst injiziert) wenn ich das nicht bekommen sollte, wenn der WhenInjectedInto
methode wird richtig angewendet.
Bitte beachten Sie auch, dass dies ein stark vereinfachtes Szenario ist, daher folgen die Klassen und Schnittstellen der Konvention, sodass für dieses Codebeispiel möglicherweise eine Lösung mit Standardkonventionen mit viel weniger IOC-Code erreicht werden kann, aber für mein aktuelles Szenario werde ich es nicht tun Klassen und Schnittstellen folgen Konventionen so fließend.
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using Ninject.Extensions.Conventions;
using Ninject.Extensions.Conventions.BindingGenerators;
using Ninject.Syntax;
namespace Ninject.Usage.Spike
{
public class ElderlyPerson : IPerson
{
private readonly IPerson _actual;
public ElderlyPerson(IPerson actual)
{
_actual = actual;
}
public string Name { get { return string.Format("Sir {0}", _actual.Name); } }
}
public class Person : IPerson
{
public string Name { get; protected set; }
}
public interface IPerson { string Name { get; } }
[TestFixture]
public class Class1
{
[Test]
public void Test()
{
using(var k = new StandardKernel())
{
k.Bind<IPerson>().To<ElderlyPerson>().InSingletonScope();
k.Bind(x => x.FromThisAssembly()
.SelectAllClasses()
.Where(t => t.IsAssignableFrom(typeof (IPerson)))
.BindWith<MyGenerator>()
.Configure(c => c.WhenInjectedInto<ElderlyPerson>().InSingletonScope()));
var person = k.Get<IPerson>();
Assert.That(person.Name, Is.StringContaining("Sir"));
}
}
}
public class MyGenerator : IBindingGenerator
{
public IEnumerable<IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, IBindingRoot bindingRoot)
{
return type == typeof(ElderlyPerson)
? Enumerable.Empty<IBindingWhenInNamedWithOrOnSyntax<object>>()
: new[] { bindingRoot.Bind(typeof(IPerson)).To(type) };
}
}
}
Lösung
Ihrer Where
bedingung ist falsch!Sie können nicht zuweisen IPerson
zu Person
.Wechseln Sie die Argumente.