Ваши вопросы требуют полноценной статьи в Википедии. Я предполагаю, что вы уже прочитали настоящую статью, поэтому вот мой краткий ответ на ваш вопрос: Внедрение зависимостей - все о создании экземпляров.
Основная идея заключается в том, что классы не должны отвечать за создание экземпляров своих зависимостей. Инфраструктура DI берет на себя создание экземпляров, потому что она может делать это гибко, с помощью механизма конфигурации, который (как правило) является внешним по отношению к вашему коду.
Это позволяет вам писать классы, которые:
- Отделен от своих зависимостей.
- Лучше сосредоточиться на их фактической ответственности (а не на их зависимости)
- Может быть изменено через конфигурацию без перекомпиляции.
- Легче тестируется.
- Возможно, лучше разработан.
Чтобы ответить на ваш второй вопрос: если вы пытаетесь узнать о DI, тогда написание каркаса самостоятельно явно излишне. Я бы порекомендовал вам выбрать одну из популярных платформ с открытым исходным кодом и написать код, который ее использует - у большинства есть хорошие учебные пособия именно для этой цели.
Подняв его на следующий уровень, вы можете взять исходный код фреймворка, который вы использовали, и начать копаться в нем. Хорошие рамки написаны очень хорошо и относительно легко читаются.
Удачи!
Urig
PS - Если вы находитесь в .net, не начинайте с MEF. Начните с Виндзора, Unity или Spring.Net. MEF - это больше и меньше, чем DI-фреймворк, поэтому оставим его чуть позже.