1

我有C#應用程序,我在Windsor容器中註冊了幾十個接口及其實現類。所有這些實現類都由Windsor單獨解析。問題是我能以某種方式讓Windsor手動解決所有這些問題並將它們連接起來以創建一個對象圖?我不需要懶惰地解決Windsor在某些組件被請求時會默認執行的操作,我需要一次性解決它們,以便進行一些調試和測試。理想情況下,我想爲所有註冊類型獲取實例數組。這可能嗎?有沒有辦法急於解決所有使用Windsor IoC容器註冊的組件?

+0

AFAIK它們不會被延遲......圖形是根據容器的第一個請求構建的(大多數容器都是這樣的,我很確定)。我不確定我是否通過「所有註冊類型的實例數組」獲得了您的意思。你能詳細說明嗎? –

+0

因此,我需要的是要求Windsor容器解析所有註冊的接口,而不是在需要時發生的懶惰解析(例如,在WebAPI應用程序收到HTTP請求時發生的項目中)。如果可能的話,我想以某種方式獲得所有已解決和實例化的對象的列表(或數組),當我明確要求Windsor進行解析時。 – matori82

回答

0

通常用於調試和測試容器,您可以使用component handler而不是解析組件本身。

說的是,西蒙是對的:當你解析一個組件時,windsor會創建真實的實例及其所有的依賴關係。除非您的意思是通過(打字)工廠實現「延遲依賴」,否則什麼都不是「延遲」,但是這很讓人滿意......

1

依賴關係圖可通過GraphNodes屬性獲得。這裏有一個簡單的例子:

[Test] 
public void Get1() 
{ 
    var container = new WindsorContainer(); 
    container.Register(Component.For<SomeClass>().LifestyleSingleton()); 
    container.Register(Component.For<Dependency>().LifestyleSingleton()); 

    var graphNodes = container.Kernel.GraphNodes; 

    Assert.That(graphNodes.Length, Is.EqualTo(2)); 
    Assert.That(graphNodes[0].Dependents[0].ToString(), Is.EqualTo(typeof(Dependency).Name)); 
    Assert.That(graphNodes[1].Dependents.Length, Is.EqualTo(0)); 
} 

你應該能夠輕鬆地確定哪些類型是「根」類型過濾掉那些依賴任何類型的...


UPDATE

GraphNode創建實例的方法之一是將GraphNode投射到Castle.Core.ComponentModel

[Test] 
public void Resolve1() 
{ 
    var container = new WindsorContainer(); 
    container.Register(Component.For<SomeClass>().LifestyleSingleton()); 
    container.Register(Component.For<Dependency>().LifestyleSingleton()); 

    var graphNodes = container.Kernel.GraphNodes; 

    var name = (graphNodes[0] as ComponentModel).ComponentName.ToString(); 
    var type = Type.GetType(name); 
    dynamic instance1 = container.Resolve(type); 
    Assert.That(instance1, Is.Not.Null); 
} 
+0

所以,當我找到所有的根GraphNode我怎麼能要求容器解決它們?我如何獲取由某個GraphNode對象描述的類/接口的類型? – matori82

+0

@ matori82請參閱我的更新以瞭解潛在解決方案 – qujck

相關問題