Я уверен, что другие будут публиковать более подробные ответы, но вот что я получил:
Все типы данных зарегистрированы в коде, а не в файле конфигурации.
Существует тенденция (, по крайней мере, в некоторых ) IoC / Dependency Injection Framework для регистрации ваших зависимостей с помощью кода, а не XML Config. Основным преимуществом является то, что вы знаете во время компиляции, что-то неправильно написано или нет. Например, если вы решите добавить / удалить аргумент конструктора, ваш код на самом деле не будет компилироваться, когда ваша конфигурация не синхронизирована (и он не дает опечаткам показывать себя как случайные исключения нулевой ссылки во время выполнения).
Все типы данных жестко запрограммированы для использования одной реализации интерфейса. Фактически, для почти всех данных интерфейсов существует и будет только одна реализация.
Я не совсем уверен, что вы подразумеваете под "реализацией с одним интерфейсом". Если вы имеете в виду, что интерфейсы передаются объектам, которые их реализуют, то это определенно не кошерно. Если нет, то есть преимущество в кодировании интерфейса, а не конкретной реализации. Основным из них, очевидно, является возможность использовать фиктивные объекты, поддерживающие указанный интерфейс, в модульном тестировании. Программирование на интерфейсе (теоретически) заставляет вас сделать ваш код более свободным, что может помочь в тестировании. Он также открывает некоторые действительно классные варианты дизайна, такие как этот Создание универсального безопасного DAO с Hibernate и Spring AOP one.
Все зарегистрированные типы данных имеют конструктор по умолчанию, поэтому Windsor не создает экземпляр графа объектов для каких-либо зарегистрированных типов.
Это тоже не обязательно плохо. В общем, я думаю, что эмпирическое правило гласит: если для вашего класса критически важна зависимость для выполнения своей функции, то следует использовать внедрение в конструктор. Если нет (логирование, вероятно, является наиболее часто используемым примером этого), то внедрение свойства является более подходящим вариантом. Хотя я не знаком с Castle Windsor, я знаю, что по крайней мере некоторые контейнеры Java IoC не поддерживали внедрение конструкторов в ранних версиях (если кто-то, кто более знаком с Castle Windsor, может прокомментировать это, это было бы здорово). Если бы в Castle Windsor не было этой функции в более ранних версиях, это также могло бы привести к дизайну, который вы видите в своей системе.
Что касается использования IoC против вызова new
везде, это также зависит от использования. Несколько проектов, над которыми я работал, в значительной степени основывались на IoC (Spring в Java и Autofac в .NET), а подключение всех моих зависимостей в одном месте позволило нам довольно быстро и безболезненно экспериментировать с иерархиями объектов и их композицией.