1

我遇到類(Parent)具有依賴關係(IScopedInstance)並且還在方法內動態解析其他接口(IOtherDependency)的情況。該接口的實現(Dependency)與原始類具有相同的依賴關係。我希望該實例的作用域爲Parent的實例,即:我想要在ParentDependency之內的相同實例,但只有在從內部解析依賴關係的情況下Parent我正在使用Castle.Windsor作爲DI容器。在動態解決依賴關係時共享範圍

public class Parent : IParent 
{ 
    public Parent(IScopedInstance instance) 
    { 

    } 

    public void DoSomething() 
    { 
     var anotherDependency = container.Resolve<IOtherDependency>(); 
    } 
} 

public class Dependency : IOtherDependency 
{ 
    public Dependency(IScopedInstance instance) 
    { 
    } 
} 

這工作時IOtherDepedency注入的Parent構造:

container.Register(Component 
      .For<IScopedInstance>() 
      .ImplementedBy<ScopedInstance>() 
      .LifestyleBoundTo(x => x.First(xx => 
       xx.ComponentModel.Implementation.InheritsOrImplements(typeof(IParent))))); 

但可以理解的,從裏面的方法解決時,這是行不通的,因爲有依賴圖中沒有IParent(這是一個新圖)。

真正的用例有點不同,我不直接解決方法中的IOtherDependency,但我刪除了所有不需要的額外信息。

任何想法如何做到這一點?

回答

0

首先,你需要一個工廠,很可能是一個打字工廠,在你的方法中,以便從容器中獲得一個實例。 我想如果你的代碼在網絡應用程序中運行,範圍內的生活方式應該適合你的需求,或者perwebrequest生活方式。

+0

@ChristianoDegiorgis是對的。您應該使用[TypeFactorySelector](http://docs.castleproject.org/Default.aspx?Page=Typed-Factory-Facility-interface-based-factories&NS=Windsor&AspxAutoDetectCookieSupport=1)註冊工廠方法或工廠,以解決您的依賴關係並通過構造函數推送它們。 你的實現的另一個缺點是你的類知道容器並且依賴於容器及其組件。 是否有阻礙您通過工廠使用構造函數注入的障礙? –

+0

正如我所說的,我並不直接解決依賴問題,但我通過工廠來完成,這在這裏並不重要。我有一個有範圍的生活方式(參見我的最後一段代碼片段),這只是裏面的方法,我需要一個動態調度。我使用的通用接口在多個地方重用。範圍界定的問題是有兩個單獨的圖,所以第二個圖不能訪問第一個圖的範圍 – Kenneth