Следуя Явному принципу зависимостей , вы можете убедиться, что все необходимые зависимости введены куда.
public class MessageProcessor {
private List<IMessageHandler> handlers;
public MessageProcessor(IEnumerable<IMessageHandler> handlers) {
this.handlers = new List<IMessageHandler>(handlers);
//removed
//handlers.add(new SomeOtherMessageHandler());
//handlers.add(new OrderMessageHandler());
}
public void ProcessMessage( IMessage msg ) {
bool messageWasHandled
foreach( IMessageHandler handler in handlers ) {
if ( handler.HandleMessage(msg) ) {
messageWasHandled = true;
break;
}
}
if ( !messageWasHandled ) {
// Do some default processing, throw error, whatever.
}
}
}
При использовании контейнера DI обязательно зарегистрируйте все вовлеченные стороны
псевдокод:
container.Register<IInterface, Implementation>();
container.Register<IMessageHandler, SomeOtherMessageHandler>();
container.Register<IMessageHandler, OrderMessageHandler>();
container.Register<MessageProcessor>();
Таким образом, контейнер знает, как построить граф объектов при разрешении нужного типа
MessageProcessor processor = container.Resolve<MessageProcessor>();
processor.ProcessMessage(...);
//...
При использовании PureDI это все еще позволяет правильно создавать и вводить все вовлеченные типы при необходимости.
IInterface dependency = new Implementation();
List<IMessageHandler> handlers = new List<IMessageHandler>();
handlers.Add(new SomeOtherMessageHandler());
handlers.Add(new OrderMessageHandler(dependency));
MessageProcessor processor = new MessageProcessor(handlers);
processor.ProcessMessage(...);
//...