Ошибка циклической зависимости при оформлении с использованием обычных привязок Ninject 3.0

Пожалуйста, смотрите пример кода ниже. Это слишком упрощенный сценарий, чтобы продемонстрировать проблему, с которой я сталкиваюсь при связывании с использованием WhenInjectedInto метод. Это всегда работало с более ранней версией ninject. Но кое-как, с этим обновлением до 3.0, я не вижу, в чем проблема. Я получаю исключение циклической зависимости (то есть декоратор внедряется в себя), когда я не должен получить его, если WhenInjectedInto метод применяется правильно.

Обратите также внимание, что это упрощенный сценарий, поэтому классы и интерфейсы следуют соглашению, поэтому, возможно, для этого примера кода решение может быть достигнуто с использованием соглашений по умолчанию с гораздо меньшим количеством кода ioc, но с учетом моего реального сценария, который я выиграл " классы и интерфейсы так свободно следуют соглашениям.

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) };
    }
}
}

1 ответ

Решение

Ваш Where условие неверное! Вы не можете назначить IPerson в Person, Переключите аргументы.

Другие вопросы по тегам