Статьи

Инъекция зависимостей 2 достигает GA


После года бета-тестирования Ninject 2 наконец-то стал GA
Нейт Кохари
вчера
написал о выпуске бесплатного инструмента и объяснил, почему задержки заняли так много времени. Ninject особенно известен своим беглым интерфейсом, который отличает его от многих других структур DI. Ninject 2 — это перезапись Ninject 1 с нуля. Версия 2.0 имеет собственный контейнер Inover-of-Control (IoC), мультиинжекцию и новую систему определения объема.

Почему DI?

Ninject — это структура внедрения зависимостей (DI) для разработки .NET. Он разделяет приложения на набор слабо связанных, высоко связных частей, а затем склеивает их вместе. Если вы внедряете зависимости без DI-фреймворка, вы сгенерируете код стрелки по всему вашему приложению, говорящий классам, как построить их зависимости:

    public Contact()
: this(new DataGateWay())
{
}

Такой инструмент, как Ninject, конденсирует код стрелки в одном месте, что облегчает изменение зависимостей:

internal class ProductionModule : StandardModule
{
public override void Load()
{
Bind<IDataGateway>().To<DataGateWay>();
}
}

Инфраструктуры DI также облегчают тестирование кода, высмеивая интерфейсы, необходимые для определенного блока кода. Функциональные возможности можно легко поменять местами, не нарушая другие части кода.

Ninject 1 против Ninject 2

Ninject 2 использует LINQ, поэтому он не поддерживает .NET 2.0 или ниже. Лучше, если вы используете Ninject 1 для чего-то ниже, чем .NET 3.5. Основным изменением в Ninject 2 является новая система определения объема, которая использует сборщик мусора для восстановления экземпляров вместо привязки поведения. Любой POCO может стать предметом обзора. Вы можете найти синтаксические изменения для определения жизненного цикла в блоге Kohari.
, Также есть новая семантика выбора конструктора. В Ninject 2 используются конструкторы с атрибутом [Inject], но с несколькими конструкторами, имеющими [Inject], вы получите исключение NotSupportedException. Если вы не поместите атрибуты [Inject] в свои конструкторы, Ninject 2 выберет атрибут, который содержит наиболее разрешимые параметры. Если конструкторы не определены, Ninject 2 просто выберет конструктор по умолчанию без параметров. Атрибуты поведения и внедрение полей были удалены из Ninject 2.

Другие новые функции в Ninject 2 включают в себя:

  • Мультиинъекция: ядро для Ninject 2 имеет методы GetAll <T> () и поддерживает множественные целевые инъекции с типами IEnumerable <T>, List <T> и массивами T. Из-за поддержки мультиинъекции Ninject 2 также имеет полную поддержку Common Service Locator .
  • Ограниченное разрешение. С момента внедрения ограничивающие предикаты теперь могут перетекать в запрос разрешения.
  • Поддержка Mono: Полная поддержка версии CLR Mono.
  • Необязательные модули: модули больше не требуются для регистрации привязок непосредственно в ядре.
  • Автоматическое сканирование модулей: каталоги можно сканировать на наличие сборок, содержащих модули, а затем загружать их в ядро.
  • IoC:  Ninject 2 имеет свой собственный контейнер Inversion of Control, что упрощает расширение ядра.


Что так долго?

Нейт Кохари объяснил, что годовая задержка между бета-версией Ninject 2 и GA была вызвана его «сумасшедшей идеей запустить
стартап ». Его новая компания, AgileZen, создала
приложение для управления Kanban. Поскольку бизнес занимал большую часть его времени, первоначальная дата участия Кохари в марте 2009 года приходила и уходила. Благодаря помощи давнего участника, Иэна Дэвиса (который теперь является со-сопровождающим), окончательная версия 2.0 была наконец-то запущена. Кохари сказал, что в Ninject 1 больше не будет никакой работы, за исключением исправления критических ошибок.

Вы можете получить Ninject 2 из репозитория на
GitHub или загрузить двоичные файлы с переработанного
сайта Ninject .