2014-09-25 3 views
1

Я не могу найти какой-либо механизм для перемещения графика зависимостей в StructureMap. Моя проблема заключается в следующем:График зависимости от перемещения в StructureMap

Класс Coordinator имеет две зависимости: ServiceA и ServiceB. Оба ServiceA и ServiceB имеют одну зависимость: CustomWebClient. CustomWebClient имеет одну зависимость: Logger.

Я должен вводить различные реализации Logger в CustomWebClient. Это зависит от того, вводится ли CustomWebClient в ServiceA или ServiceB.

Единственный условный механизм, который я нашел, основан на родительском типе и корневом типе, но это не помогает в моем случае. Можно ли настроить это в StructureMap?

+0

Должен быть создан новый 'CustomWebClientB', который происходит из' CustomWebClient', который зависит от 'LoggerB'? Затем условно используйте это, если 'ParentType' является' ServiceB'. – mxmissile

+0

Спасибо, но я действительно не хочу этого делать. Реальная ситуация более сложная, и я упростил ее, чтобы выразить суть проблемы. В нашем проекте есть 6 видов Услуг. Кроме того, в «CustomWebClient» есть несколько декораторов. Я хочу избежать создания еще 18 классов. – Kuba

+0

Да, это меняет вещи. – mxmissile

ответ

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(); 
} 

In StructureMap 3.1.2.0 мы должны использовать _instances частное поле из BuildSession объекта (IContext реализации). _instances Поле имеет следующий тип: Stack<Instance>.

Смежные вопросы