Ninject: передать родительский экземпляр разрешаемому ребенку - PullRequest
4 голосов
/ 30 мая 2011

У меня есть эта иерархия классов:

public interface ISR { }
public interface ICU { }
public interface IFI { }   

public class CU : ICU { }

public class SR : ISR
{
    public SR(IFI fi)
    {
        FI = fi;
    }

    public IFI FI { get; set; }
}

public class FI : IFI
{
    public FI(ISR sr, ICU cu)
    {
        SR = sr;
        CU = cu;
    }

    public ISR SR { get; set; }
    public ICU CU { get; set; }
}

public class Module : NinjectModule
{
    public override void Load()
    {
        Bind<ISR>().To<SR>();
        Bind<ICU>().To<CU>();
        Bind<IFI>().To<FI>();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var kernel = new StandardKernel(new Module());

        var sr = kernel.Get<ISR>();
    }
}

Когда я запускаю этот код, у меня возникает исключение, потому что у меня есть циклическая зависимость.Классу SR необходим экземпляр IFI, который нужно внедрить, чтобы его завершить, а классу FI нужен экземпляр ISR, который нужно внедрить.

Конечно, использование внедрения свойства не решает эту проблему.

У меня есть особенность: мне нужно, чтобы сначала был создан ISR, и именно этот экземпляр должен быть передан FI.Поэтому ISR и IFI должны совместно использовать область действия.

Как бы вы решили это с Ninject?

1 Ответ

5 голосов
/ 31 мая 2011

Лучший способ решить эту проблему - это реорганизовать ваш дизайн, чтобы удалить циклическую зависимость. Почти все циклические зависимости могут быть удалены с надлежащим дизайном. Если у вас есть циклические зависимости, то обычно есть недостаток дизайна. Скорее всего, вы не выполняете принцип единой ответственности.

В противном случае вы должны выполнить двустороннее внедрение свойства и убедиться, что они имеют одинаковую область действия. Например. InCallScope из расширения NamedScope. Смотри http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

...