4
我有這樣的類層次結構: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?
我不認爲我可以重構我的課程。我剛剛嘗試使用雙重屬性注入,並將.InCallScope()添加到IFI的綁定中,但在這種情況下,調用SR的構造函數,然後調用FI的ctor,然後再次調用SR的ctor,最後,當我解析ISR時,我有一個InvalidOperationException異常,消息:Sequence不包含任何元素 – Mike 2011-05-31 08:31:13
是什麼使修復循環依賴不可能?我會繼續閱讀@Mark Seemann Book。它有關於如何解決循環依賴關係的精彩篇章。其他任何事情都只是治療症狀。 而且兩種屬性注入的效果都很好,只需在InCallScope上對兩種綁定進行測試。 – 2011-05-31 10:36:10
IFI是由ISR(也是視圖模型)組成的視圖模型,用於顯示一些信息。但是IFI需要ISR的工作,因爲它需要訪問ISR的一些屬性,並在這些屬性更新時得到通知。順便說一句,我剛剛在兩個綁定(而不是僅在IFI綁定)上使用InCallScope測試了雙重屬性注入,我仍然有例外。 – Mike 2011-05-31 10:53:14