Я использую выбранный вами дизайн довольно часто, не всегда с IoC.
Похоже, у вас проблема с документацией. Код не объясняет, что он делает. Я вижу пару решений этой проблемы.
Во-первых, вы можете прокомментировать свой код. Это часто запах, и во многом зависит от реализации. Вы также можете комментировать на месте, назвав свои конфигурации IoC определенным образом.
Во-вторых, вы можете создавать скопления объектов. Например, если есть три объекта, которые обычно запускаются вместе, вы можете создать класс «AuthorizeAndAudit», который делегирует другим объектам (вероятно, построенный с использованием IoC и «семейств плагинов» или как там их называет ваш контейнер, если поддерживается). Это лучше связывает воедино намерение объектов. Я склонен иметь коллекцию IMessageHandler, которая также реализует IMessageHandler и делает foreach для себя.
В-третьих, вы можете выделить интерфейсы. Похоже, у вас может возникнуть ситуация, когда вы разделяете объекты только потому, что они содержат действия, которые происходят в разных частях цепочки. Вы можете создать один интерфейс (или метод на общем интерфейсе) для аутентификации, один для аудита и т. Д. Ваши объекты могут реализовывать на одном или нескольких из этих интерфейсов. Так как порядок интерфейсов определен (вызов Auth, затем Audit и т. Д.), Ваши объекты могут выполнять несколько шагов в цепочке (в итоге вы получаете цепочку цепочек) без необходимости разделения на отдельные классы. У вас может даже быть объект, например, средство отслеживания журналов, которое находится во всех цепочках и журналах при вызове каждого шага.
Кроме того, вы начинаете сталкиваться с чем-то более сложным, например, с рабочим процессом, и Windows Workflow может быть хорошим местом для поиска.