Ninject: дать родительскому экземпляру для ребенка решаются


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

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 4

1 ответ:

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

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