Ninject: Как использовать многослойные именованные области с фабрикой - PullRequest
0 голосов
/ 09 октября 2018

Я использую Ninject в своем приложении вместе с расширениями Factory и NamedScope.Я хочу создать следующую иерархию:

enter image description here

Вот мой текущий код:

public interface IChildFactory
{
    ScopedChild Create();
}

public interface IGrandChildFactory
{
    ScopedGrandChild Create();
}

public class ScopedParent
{
    private static int _nextId;

    public IChildFactory ChildFactory { get; }
    public IList<ScopedChild> Children { get; } = new List<ScopedChild>();
    public int Id { get; set; }

    public ScopedParent(IChildFactory childFactory)
    {
        ChildFactory = childFactory;
        Id = Interlocked.Increment(ref _nextId);
    }

    public void GenerateKids()
    {
        for (int i = 0; i < 5; i++)
        {
            var kid = ChildFactory.Create();
            Children.Add(kid);
            kid.GenerateKids();
        }
    }
}

И:

public class ScopedChild
{
    public IGrandChildFactory GrandChildFactory { get; }

    private static int _nextId;

    public int Id { get; set; }

    public IList<ScopedGrandChild> Grandchildren { get; } = new List<ScopedGrandChild>();

    public ScopedChild(IGrandChildFactory grandChildFactory)
    {
        GrandChildFactory = grandChildFactory;
        Id = Interlocked.Increment(ref _nextId);
    }

    public void GenerateKids()
    {
        for (int i = 0; i < 3; i++)
        {
            Grandchildren.Add(GrandChildFactory.Create());
        }
    }
}

public class ScopedGrandChild
{
    public ScopedParent ScopedParent { get; }

    public ScopedChild ScopedChild { get; }

    public ScopedGrandChild(ScopedParent scopedParent, ScopedChild scopedChild)
    {
        ScopedParent = scopedParent;
        ScopedChild = scopedChild;
    }
}

В этом посте я натолкнулся на предложение по внедрению корневого объекта: Ninject: Как получить доступ к корневому объекту NamedScope с фабрики , но мне не удалось внедрить отдельные экземпляры ScopedChild в соответствующий класс ScopedGrandChild.

В конце концов я хочу сделать следующие вызовы:

var parent = kernel.Get<ScopedParent>();
var parent2 = kernel.Get<ScopedParent>();

// call subsequent generate kids
parent.GenerateKids();
parent2.GenerateKids();

и получить инициализированную полную иерархию.

...