Проводится обсуждение между хранителями существующих библиотек DI, независимо от того, нужно ли создавать, поддерживать и поддерживать адаптер для новой встроенной системы ввода данных ASP.NET. У сопровождающих Autofac есть confirmed, что они будут создавать и поддерживать адаптер, а команда Ninject - silent, а также другие команды, такие как команда Simple Injector (включая меня) have explained, что они не будут поддерживать адаптер.
Лично я считаю, что встроенная библиотека DI ASP.NET - это хорошая и чистая библиотека DI, но она ограничена простыми приложениями. Как я объяснил here, многие функции, необходимые для разработки поддерживаемых приложений, основанных на принципах SOLID, не поддерживаются. Однако, как и библиотека Unity DI, сделанная пару лет назад, я думаю, что этот встроенный контейнер может заставить разработчиков начать использовать инъекцию зависимостей, что является победой для нашей отрасли.
Эти ограничения делают встроенный контейнер особенно подходящим для настройки и расширения самой системы ASP.NET. Для создания больших поддерживаемых приложений вам потребуется использовать другую библиотеку DI. Это, конечно, хорошо; вам нужно будет выбрать нужные инструменты для работы.
К сожалению, до сих пор команда ASP.NET сообщила publicly, что использование другой библиотеки DI означает, что вам придется писать/использовать адаптер. К сожалению, это неправильное сообщение IMO, потому что большинство библиотек DI несовместимы с API, представленным встроенным контейнером (как я подробно объяснил here и here). Только Autofac кажется разумно синхронизированным, что объясняет, почему команда Autofac предпочитает поддерживать адаптер. Но обратите внимание, что даже Autofac оказался несовместимым с абстракцией, которую Microsoft определила, и они (как и StructureMap) должны были сделать big changes своим продуктом, чтобы быть в состоянии соответствовать абстракции. И автозагрузчики Autofac - это severely frustrated о целом процессе и абстракции в целом. И, как я объяснил, here, даже реализация адаптера адаптера ASP.NET, реализованная в ASP.NET, нарушена.
Это сообщение команды ASP.NET для использования адаптера является большой ошибкой IMO, потому что это задушит инновации (в то время как сама библиотека DI не является, это просто еще одна библиотека DI). ASP.Команда NET продвигает модель, в которой как ваши прикладные компоненты, так и система ASP.NET (и все другие подсистемы, которые будут подключаться в будущем) будут зарегистрированы в вашем пользовательском контейнере. Гораздо разумнее и практично сохранить конфигурацию вашего приложения отдельно от конфигурации системы ASP.NET (как объяснено here).
Из-за этого я считаю использование адаптера для любого контейнера более бесполезным. Как я показал here, действительно легко подключить собственный контейнер DI, сохраняя его полностью отдельно от регистрации ASP.NET. Это означает, что вам не нужна поддержка Ninject для эффективного использования Ninject в проекте ASP.NET Core. Единственное, что нужно сделать Ninject, это создать версию, совместимую с .NET Core (в случае, если ваш продукт должен работать на этой новой платформе).
Итак, я не уверен, что поддержка «вымирает», хотя некоторые поддерживающие DI (например, команда простого инжектора и, возможно, Castle Windsor и Ninject) выбрали не строить, поддерживать и поддерживать реализацию адаптера для ядра ASP.NET, потому что он не нужен и находится только в пути.
ОБНОВЛЕНИЕ ноября 2016
Я был discussing some improvements в ASP.NET Ядра с Microsoft, чтобы сделать его проще плагин контейнер, которые не имеют адаптер (посмотрите на мой example repository и особенно к Startup.cs of the Ninject sample project), но до сих пор Microsoft, похоже, отстает от прогресса, потому что (как утверждает Фаулер) их «bias towards conforming containers [] помутняет [их] видение».
Спасибо за проницательный пост, главное, что отсутствует в встроенном контейнере DI, не существует сопоставления, основанного на соглашениях. Я должен включать каждый проект в мой проект запуска и отображать зависимости. Это кажется огромной ошибкой, если я чего-то не упускаю. – Spets
@Spets Встроенный контейнер специально предназначен как система конфигурации для самого ASP.NET. Таким образом, это означает, что вы можете легко обменивать части ASP.NET, а сторонние компоненты могут использовать одну и ту же конфигурационную модель. Встроенный контейнер построен вокруг этой модели, и это объясняет, почему некоторые функции не реализованы. Обратите внимание, что пакетная регистрация на самом деле легко написать себя поверх контейнера, и чтобы стать неотразимой библиотекой DI, сначала должны быть реализованы другие важные функции. Но опять же, не злоупотребляйте системой DI для регистрации ваших собственных типов. – Steven
Gotcha, что имеет смысл. – Spets