IoC, АОП и многое другое

Что такое контейнер IoC?

Что такое инфраструктура IoC/DI?

Зачем нужна инфраструктура для IoC/DI?

Есть ли какая-либо связь между IoC/DI и AOP?

Что такое Spring.net/ninject относительно IoC и AOP?

Ответ 1

JMSA,

Джеймс Ковач написал фантастическую статью, которая охватывает многие ваши вопросы, которые я бы рекомендовал прочитать. Здесь

Spring.Net, Ninject, Unity, Castle Windsor, Autofac - все контейнеры IOC, которые настраиваются по-разному, многие из них также поддерживают AOP.

Рамки для IOC/DI полезны, потому что они предоставляют стандартные механизмы, например, если вы нанимаете нового разработчика, гораздо проще сказать, мы используем эту структуру и передаем им ссылки на учебники/справочные руководства. В то же время эти рамки проверяются и тестируются крупным сообществом/компаниями.

Позвольте мне знать, останутся ли без ответа ваши вопросы после прочтения статьи и выше, и я сделаю все возможное, чтобы оказать дополнительную помощь.

Ответ 2

С точки зрения семантики...

Зависимость Инъекция сама по себе подразумевает зависимость, то есть что-то, что требуется для построения/использования (основная проблема приложения). Например, автомобиль не автомобиль без двигателя.

Аспекты описываются как сквозные для основных задач приложения. Это означает, что как отдельные, так и не имеющие решающее значение для основных проблем (вы можете думать о них как о "хороших для имущих" ). Поскольку приложение может работать без каких-либо аспектов, являются ли они действительно зависимыми? Например, автомобиль по-прежнему остается автомобилем, даже без иммобилайзера.

(Конечно, это с теоретической точки зрения. В реальном мире такие вопросы, как безопасность, часто имеют решающее значение для существования товарного продукта, поскольку основное внимание касается самих себя.)

Итак, пока на практике DI может использоваться для реализации аспектов, я бы не назвал этот процесс истинным DI. Это происходит от тех, кто использует эксклюзивную конструкцию.

Ответ 3

У Мартина Фаулера есть хорошая статья здесь о значении инверсии управления и инъекции зависимостей.

Spring Использование AOP в .NET подробно описано здесь. Я больше знаком с Java-версией Spring, поэтому я не могу с полной уверенностью сказать, что Spring.NET в настоящее время поддерживает только AOP на основе прокси.

То есть, класс, которому следует посоветовать, должен реализовать интерфейс. Spring создаст динамический прокси-сервер, который реализует этот интерфейс и делегирует исходный целевой экземпляр.

Хотя он имеет значение:

В будущей версии мы будем внедрять прокси-серверы с использованием наследования, что позволит вам также прокси-классы без интерфейсов, а также удалить некоторые из оставшихся исходных проблем, которые не могут быть решены с использованием прокси-серверов на основе состава.