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 ответ:
Лучший способ справиться с этой проблемой-это рефакторинг вашего проекта для удаления циклической зависимости. Почти все циклические зависимости могут быть удалены при правильном проектировании. Если у вас есть циклические зависимости, то, как правило, есть недостаток в дизайне. Скорее всего, вы не выполняете принцип единой ответственности.
В противном случае необходимо выполнить двустороннюю инъекцию свойств и убедиться, что они имеют одинаковую область действия. Например, InCallScope из расширения NamedScope. Видеть http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/