2014-09-25 88 views
1

我找不到任何機制來遍歷StructureMap中的依賴關係圖。 我的問題如下:StructureMap中的遍歷依賴關係圖

Coordinator有兩個依賴關係:ServiceAServiceBServiceAServiceB都有一個依賴關係:CustomWebClientCustomWebClient有一個依賴關係:Logger

我必須將Logger的不同實現注入到CustomWebClient中。這取決於CustomWebClient是否注入ServiceAServiceB

我發現的唯一條件機制是基於父類型和根類型,但它對我的情況沒有幫助。可以在StructureMap中配置嗎?

+0

應該能夠創建一個新的'CustomWebClientB'派生自'CustomWebClient'依賴於'LoggerB'?然後有條件地使用,如果'ParentType'是'ServiceB'。 – mxmissile 2014-09-25 16:57:22

+0

謝謝,但我真的不想那樣做。真實情況更爲複雜,我將其簡化爲表達問題的實質。在我們的項目中有6種類型的服務。除此之外,'CustomWebClient'有幾個裝飾器。我想避免創建18個以上的課程。 – Kuba 2014-09-25 17:07:20

+0

是的,這改變了事情。 – mxmissile 2014-09-25 17:34:22

回答

0

雖然我沒有找到任何方法以正常的方式做到這一點,但我發現StructureMap在內部存儲依賴堆棧。

StructureMap 2.6.4.0我們可以利用構建的堆棧幀:

container.For<Logger>().AlwaysUnique().Use(ctx => 
{ 
    var pi = typeof (BuildFrame).GetProperty("Parent", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 
    var frame = ctx.BuildStack.Parent; 

    while (frame != null) 
    { 
     var currentType = frame.ConcreteType; 

     if (currentType == typeof(ServiceA)) 
      return new LoggerA(); 
     if (currentType == typeof(ServiceB)) 
      return new LoggerB(); 

     frame = (BuildFrame)pi.GetValue(frame, null); 
    } 

    return new LoggerDefault(); 
} 

StructureMap 3.1.2.0我們必須使用BuildSession對象(IContext實現)的_instances私人領域。 _instances字段具有以下類型:Stack<Instance>