2014-02-26 73 views
1

我有限定範圍的對象:Ninject上下文提取

Bind<ISomething>().To<Something>().DefinesNamedScope(SomethingScope); 

我也有一個自動生成的工廠,創建IAnotherThing:

public interface IAnotherThingFactory 
{ 
    IAnotherThing CreateAnotherThing(ISomething x); 
} 

並將其綁定:

Bind<IAnotherThingFactory>().ToFactory(); 

我想在ISomething的上下文中創建IAnotherThing,所以我可以例如有一個ISharedPrivateDependency,它們都獲得相同的實例。但是,某些東西一定不會意識到其他東西。這意味着,理想情況下,應該有一種方法可以從ISomething參數中提取上下文,並使用它爲IAnotherThing設置上下文。

爲了得到這種行爲,我必須定義或編寫什麼綁定?

我不想直接暴露內核,只有工廠。評論後

編輯:

  • 把工廠進行AnotherThing到ISomething解決上下文問題,但暴露ISomething到IAnotherThing。以上是對答案的要求:ISomething一定不知道IAnotherThing。所以這是一個不行。
  • 在ISomething接口中公開Ninject-internals也是一樣。
+0

你能說清楚你的意思是「背景」嗎?你在問'如果沒有'ISomething'知道'IAnotherThing',如何讓'IAnotherThing'在'ISomething'內部可用? ... –

+0

Ninject Context Preservation Extension中的上下文。 – Wilbert

+0

您是否明確需要使用'ToFactory()'還是可行的以創建您自己的工廠/提供者? – cvbarros

回答

0

看一看ninject contextpreservation擴展:https://github.com/ninject/ninject.extensions.contextpreservation/wiki

ISomething需要,以便通過IAnotherThingFactory創建使用相同的上下文ISomething對象提供IAnotherThingFactory(p.Ex.財產)。

提示:工廠的範圍可能是相關的。如果您定義了工廠.InSingletonScope,它將無法工作,或者更確切地說,工廠創建的所有對象都將具有與首次請求工廠對象相同的上下文。

如果您需要它更通用,你可以做的是注入IResolutionRootISomething並提供它作爲財產。然後有人能做到ISomething.ResolutionRoot.GetContextPresreving<IFoo>();甚至 ISomething.ResolutionRoot.GetContextPresreving<IAnotherThingFactory>().CreateAnotherThing();

如果你不想引用ninject,你可以做的是隱藏在IResolutionRoot包裝IFactory,如:

internal class Factory : IFactory { 

    private readonly IResolutionRoot resolutionRoot; 

    public Factory(IResolutionRoot resolutionRoot) { 
     this.resolutionRoot = resolutionRoot; 
    } 

    T Create<T>() { 
     return this.resolutionRoot.GetContextPreserving<T>(); 
    } 
} 

但是我認爲,這可以可能通過改進設計來解決(在更大的範圍內)。對我們來說,至少從來沒有必要做這樣的事情 - 儘管我們有要求在與另一個對象相同的上下文中晚期創建對象,而創建是從不同的上下文觸發的。

+0

是的,這可以通過將工廠放在ISomething上來解決。但我明確不想這樣做(這就是爲什麼我寫了ISomething不知道其他Thing的原因)。如果我公開解決方案,我會公開ninject,這也是我不想做的。 – Wilbert

+0

然後將'IResolutionRoot'包裝在另一個接口後面,如'IFactory.Create ()'。 – BatteryBackupUnit