Я использую Ninject в своем приложении вместе с расширениями Factory и NamedScope.Я хочу создать следующую иерархию:
Вот мой текущий код:
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();
и получить инициализированную полную иерархию.