Структурная рекурсия с использованием конструктора - PullRequest
0 голосов
/ 01 октября 2018

Мне нужно выяснить, как внедрить реализацию интерфейса в себя.Как в примере ниже, где я хотел бы использовать метод add рекурсивно.

Простой интерфейс с функцией добавления

public interface IRecursiveFactory
{
    int Add(int number, int max = 10);
}

Внедрен в контейнер DI

container.For<IRecursiveFactory>().Use<RecursiveFactory>();

Это была бы очевидная реализация , но она не является рекурсивной

public class RecursiveFactory : IRecursiveFactory
{
    public int Add(int number, int max = 10)
    {
        while (number < max)
        {
            number++;
            Console.WriteLine(number);
        }

        return number;
    }
}

Это рекурсивный пример, который не будет работать, он возвращает ошибку Activation error occurred while trying to get an instance of type IRecursiveFactory

public class RecursiveFactory : IRecursiveFactory
{
    private readonly IRecursiveFactory _recursiveFactory;

    // Inject "self"
    public RecursiveFactory(IRecursiveFactory recursiveFactory)
    {
        _recursiveFactory = recursiveFactory;
    }

    public int Add(int number, int max = 10)
    {
        while (number < max)
        {
            // recurse
            var newNumber = number + 1;
            Console.WriteLine(newNumber);
            number = _recursiveFactory.Add(newNumber);
        }

        return number;
    }
}

1 Ответ

0 голосов
/ 01 октября 2018

Оказывается, Lazy Resolution решает эту проблему, другие решения по-прежнему интересны, поскольку это явно проблема активации.

Рабочая версия с Lazy

public class RecursiveFactory : IRecursiveFactory
{
    private readonly Lazy<IRecursiveFactory> _recursiveFactory;

    public RecursiveFactory(Lazy<IRecursiveFactory> recursiveFactory)
    {
        _recursiveFactory = recursiveFactory;
    }

    public int Add(int number, int max = 10)
    {
        while (number < max)
        {
            var newNumber = number + 1;
            Console.WriteLine(newNumber);
            number = _recursiveFactory.Value.Add(newNumber);
        }

        return number;
    }
}
...