2012-11-26 111 views
2

我想用Ninject來編寫一個對象圖,其中父對象包含一個子對象,並且子對象也維護對其父對象的引用。Ninject - 如何從注入的子對象引用父對象

沒有依賴注入,它會是這個樣子:

public interface IParent { } 
public interface IChild { } 

public class Parent : IParent 
{ 
    public Parent() 
    { 
     Child = new Child(this); 
    } 

    public IChild Child { get; private set; }  
} 

public class Child : IChild 
{ 
    public Child(IParent parent) 
    { 
     Parent = parent; 
    } 

    public IParent Parent { get; private set; } 
} 

我希望能夠配置Ninject綁定來支持這種關係,使得IParent多個實例可以在短暫的範圍被實例化,每個實例都會自動填充一個IChild實例,該實例持有對其的循環引用。

我讀過的評論表明Ninject可以支持循環關係,但是我還沒有能夠達到工作配置。

有什麼建議嗎?

謝謝,

Tim。

+0

至少我試過......我沒有成功,也沒有很多reasources到這個主題。這是因爲你首先不應該有循環依賴。你應該考慮使用不同的設計。 –

+0

@Viktor - 是的,我也對循環引用感到不舒服,但我還沒有找到任何其他可以做我需要的設計。無論如何,我已經找到了一個合理的解決方法(下面發佈)。看看其他人是否發佈了真正的解決方案將是有趣的。 –

回答

3

萬一別人運行到這個問題,這裏是我使用的解決方案(雖然我承認有可能存在更好的):

public interface IParent { } 

public interface IChild 
{ 
    IParent Parent { get; set; } 
} 

public class Parent : IParent, IInitializable 
{ 
    public Parent(IChild child) 
    { 
     Child = child; 
    } 

    public IChild Child { get; private set; } 

    public void Initialize() 
    { 
     Child.Parent = this; 
    } 
} 

public class Child : IChild 
{ 
    public IParent Parent { get; set; } 
} 

的關鍵是要實現Ninject的父類IInitializable接口,這會導致它在合成完成後收到回調。在此回調處理程序中,父實例只是簡單地爲子對象分配一個對this的引用。

+0

這裏的派對非常晚,但如果有人在這裏絆倒,那麼有一個解決方案和工作代碼[在這個頁面上](http://www.emidee.net/index.php/2010/08/23/ninject-use - 酮數據庫會話每次觀看模型/)。 –