2011-05-30 31 views
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?

回答

5

處理此問題的最佳方法是重構您的設計以刪除循環依賴項。幾乎所有的循環依賴都可以通過適當的設計來消除。如果你有循環依賴,通常會有設計缺陷。很可能你不履行單一責任原則。

否則,你必須做雙向屬性注入並確保它們具有相同的範圍。例如。 NamedScope擴展中的InCallScope。請參閱http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

+0

我不認爲我可以重構我的課程。我剛剛嘗試使用雙重屬性注入,並將.InCallScope()添加到IFI的綁定中,但在這種情況下,調用SR的構造函數,然後調用FI的ctor,然後再次調用SR的ctor,最後,當我解析ISR時,我有一個InvalidOperationException異常,消息:Sequence不包含任何元素 – Mike 2011-05-31 08:31:13

+2

是什麼使修復循環依賴不可能?我會繼續閱讀@Mark Seemann Book。它有關於如何解決循環依賴關係的精彩篇章。其他任何事情都只是治療症狀。 而且兩種屬性注入的效果都很好,只需在InCallScope上對兩種綁定進行測試。 – 2011-05-31 10:36:10

+0

IFI是由ISR(也是視圖模型)組成的視圖模型,用於顯示一些信息。但是IFI需要ISR的工作,因爲它需要訪問ISR的一些屬性,並在這些屬性更新時得到通知。順便說一句,我剛剛在兩個綁定(而不是僅在IFI綁定)上使用InCallScope測試了雙重屬性注入,我仍然有例外。 – Mike 2011-05-31 10:53:14