2015-09-25 4 views
14

Я очень счастливо использовал Ninject в течение длительного времени, и мне это очень нравится, но я столкнулся с трудным выбором с момента выпуска ASP.NET 5 и MVC 6.Поддержка Ninject в ASP.NET MVC 6?

В принципе, вне ворот Microsoft раскрыла свою систему впрыска зависимостей; Это тот, который, насколько мне известно, получил много критики. Но моя большая проблема заключается в том, как это влияет на другие библиотеки.

От another question I asked и other resources online, кажется, что Ninject не работает из коробки с MVC 6. Хотя есть «решение» дано в виде многословной библиотеки Microsoft.Framework.DependencyInjection.Ninject and Ninject. Это даже сложнее, потому что эта библиотека требует добавления https://www.myget.org/F/aspnetmaster/ в ваш список NuGet каналов.

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

  • Библиотека не действительно, кажется, во главе с создателями Ninject
  • Библиотека захороненных довольно глубоко в темном хранилище
  • Фактические ресурсы Ninject онлайн никогда не упоминают его

Так В основном, я очень обеспокоен тем, что это какой-то банд-помощник, и что поддержка Ninject (и даже других библиотек-контейнеров) вымирает. Есть ли скрытая информация, которую я просто не открываю?

ответ

9
  • Библиотека не действительно, кажется, во главе с Ninject создателями

этой библиотекой, и, казалось бы these also, смотрите, чтобы быть Microsoft создала образцы поставщиков Injection зависимости, были removed in beta7. Обратите внимание, что ссылка на DI in MVC 6, на которую ссылается ваш original question, говорит следующее:

Эти адаптеры для контейнеров DI являются временными и доступны для справки; , мы ожидаем, что они в конечном итоге будут удалены и заменены соответствующими владельцами контейнеров .

Как и должно быть. Microsoft не должна нести ответственность за поддержание сторонних поставщиков.

  • Библиотека похоронен довольно глубоко в темном хранилище

Если вы не знаете, ASP.NET 5 еще находится в разработке.Бета 7 доступна на nuget в качестве предварительного выпуска, но есть и другие источники, включая;

These источники поддерживаются Microsoft.

  • Фактических ресурсы Ninject онлайн никогда не упоминает его

Как и с любой новой разработкой, 3-провайдеры библиотечной партии должны сами определить, когда (если вообще) они будут обеспечивать реализацию своих продуктов которые поддерживают новую кодовую базу. Для некоторых это будет считаться наиболее эффективным до тех пор, пока новая формация не будет официально выпущена, поскольку изменения в нарушении API по-прежнему весьма вероятны до этого момента. Будет ли поддержка реализована вообще, конечно, до ресурсов провайдеров и/или в случае сообщества с открытым исходным кодом.

38

Проводится обсуждение между хранителями существующих библиотек 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 [] помутняет [их] видение».

+0

Спасибо за проницательный пост, главное, что отсутствует в встроенном контейнере DI, не существует сопоставления, основанного на соглашениях. Я должен включать каждый проект в мой проект запуска и отображать зависимости. Это кажется огромной ошибкой, если я чего-то не упускаю. – Spets

+3

@Spets Встроенный контейнер специально предназначен как система конфигурации для самого ASP.NET. Таким образом, это означает, что вы можете легко обменивать части ASP.NET, а сторонние компоненты могут использовать одну и ту же конфигурационную модель. Встроенный контейнер построен вокруг этой модели, и это объясняет, почему некоторые функции не реализованы. Обратите внимание, что пакетная регистрация на самом деле легко написать себя поверх контейнера, и чтобы стать неотразимой библиотекой DI, сначала должны быть реализованы другие важные функции. Но опять же, не злоупотребляйте системой DI для регистрации ваших собственных типов. – Steven

+0

Gotcha, что имеет смысл. – Spets