Мне нравится использовать цепочки декораторов вместо наследования, и до тех пор, пока мои сервисы имеют образ жизни Singleton или Transient (и их зависимости определены одинаково), это работает отлично.Я начал использовать TypedFactoryFacility для создания фабрик для сервисов, которые требуют какой-то ввод, который не может быть разрешен через контейнер ioc.Моя головная боль начинается, когда что-то глубоко в цепочке декораторов требует фабрики, а Виндзор отказывается передавать встроенные зависимости вниз по цепочке наследования.Как я понимаю, это разработано, но я не согласен с тем, что это нарушает инкапсуляцию, когда вы используете фабрику, которая явно указывает, что вам нужно для вывода (я думаю, что Windsor должен передавать встроенные зависимости компонентам, которые можно разрешить на фабрике, ноЯ предполагаю, что это не так просто. В любом случае, в конце дня я выставляю свою цепочку декораторов следующим образом:
public ISessionInputOutput Create(Session session)
{
IServerInput baseInput = _inputFactory.GetBaseInput(session.CommunicationSocketStream);
IServerInput threadSafeInput = _inputFactory.GetThreadSafeInput(baseInput);
IServerOutput output = _outputFactory.Create(session.CommunicationSocketStream);
ISessionInputOutput baseIO = _sessionIOFactory.GetBaseIO(baseInput, output);
ISessionInputOutput commandHandlerIO = _sessionIOFactory.GetCommandHandlerIO(baseIO, session);
ISessionInputOutput errorHandlingIO = _sessionIOFactory.GetErrorHandlingIO(commandHandlerIO, session);
_releaseInfo.Add(errorHandlingIO, new CreatedIOInformation(baseInput, threadSafeInput, output, baseIO, commandHandlerIO));
return errorHandlingIO;
}
В примере я использую 3 фабричных прокси и вручную комбинируювывод для создания цепочки декораторов.
Я не могу просто использовать ServiceOverrides, как обычно делаю для представления новых сервисов. Это не правильно , и я надеюсь, что кто-то может предложить лучшее решението, что я использовал выше.
Я также пытался решить эту проблему с помощью дочерних контейнеров, но это привносит в стек немного больше ioc деталей, чем мне нравится.