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) };
    }
}
}
War es hilfreich?

Lösung

Ihrer Where bedingung ist falsch!Sie können nicht zuweisen IPerson zu Person.Wechseln Sie die Argumente.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top