2014-02-24 112 views
0

我正在嘗試將依賴關係注入到Ninject的過渡注入中,並且我有一個關於延遲注入範圍的問題。我有一個包含父母和孩子的基本分層結構。孩子被注入到母公司,他們都獲得了財產「的徽章」注入:Ninject依賴注入範圍界定

public class Parent 
{ 
    [Inject] 
    public Child Child { get; set; } 

    [Inject] 
    public CoatOfArms CoatOfArms { get; set; } 
} 

public class Child 
{ 
    [Inject] 
    public CoatOfArms CoatOfArms { get; set; } 
} 

public class CoatOfArms 
{ 
} 

因爲他們是在同一個家庭,他們應該都得到武器的外套一樣,所以我成立我綁定範圍他們在父請求CoastOfArms:

​​

這一切工作正常,但讓我們說,我想稍微改變它,這樣孩子以後注入,母公司已經注入後良好。我消除對兒童財產Inject屬性,注入內核並使用它來注入孩子的方法:

[Inject] 
    public IKernel Kernel { get; set; } 

    public Child Child { get; set; } 

    public void InjectChild() 
    { 
     this.Child = this.Kernel.Get<Child>(); 
    } 

這打破了,因爲它是一個完全新的要求和步行請求樹停止與該請求。我可以手動將CoatOfArms作爲屬性傳遞,但是我必須記住在嘗試創建子對象的代碼中的其他任何地方執行此操作。此外,子類可能有自己的子孫,所以我將不得不手動將參數全部向下傳遞給層次鏈,從而失去了依賴注入範圍的所有好處。

有沒有辦法創建我的子對象,並以某種方式將請求鏈接到父請求,以便作用域的工作方式就像該子對象已經與父對象同時注入一樣?

回答

0

使用ninject.extensions.contextpreservation(https://github.com/ninject/ninject.extensions.contextpreservation/wiki,可作爲NuGet包),然後改變

public void InjectChild() 
{ 
    this.Child = this.Kernel.Get<Child>(); 
} 

public void InjectChild() 
{ 
    this.Child = this.Kernel.ContextPreservingGet<Child>(); 
} 

(所述.ContextPreservingGet<Child>()是一個擴展並且因此可能需要一個using Some.Name.Space;是識別)。

順便問一下,你也可以改變你的自定義的範圍界定爲以下內容: 公共類FamilyModule:NinjectModule { 私人常量字符串FamilyScopeName =「FamilyScopeName」;

public override void Load() 
{ 
    Bind<Parent>().ToSelf().DefinesNamedScope(FamilyScopeName); 
    Bind<Child>().ToSelf(); 
    Bind<CoatOfArms>().ToSelf().InNamedScope(FamilyScopeName); 
} 

}

這就要求:https://github.com/ninject/ninject.extensions.namedscope(也可作爲NuGet包)

編輯:您可能還需要從IKernel更改爲IResolutionRoot解決。