我有这个类层次结构:
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解决这个问题?
答案 0 :(得分:5)
解决此问题的最佳方法是重构您的设计以消除循环依赖关系。几乎所有的循环依赖都可以通过适当的设计去除。如果你有循环依赖,通常会有一个设计缺陷。您很可能不履行单一责任原则。
否则,您必须执行双向属性注入并确保它们具有相同的范围。例如。来自NamedScope扩展的InCallScope。见http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/