Какие платформы .NET Dependency Injection стоит изучить? [закрыто]


386

Какие платформы внедрения C # / .NET Dependency Injection стоит изучить? А что вы можете сказать об их сложности и скорости.


13
IoC Container Benchmark - Сравнение производительности содержит таблицы сравнения производительности и возможностей для более чем 20 продуктов и поддерживает их в актуальном состоянии. Он рекомендует простой инжектор
Майкл Фрейдгейм

Я ценю Ninject & Maestro. Я рад, что в ответе с самым высоким рейтингом Ninject считается «абсолютным удовольствием»
Разван Думитру

6
Я хотел бы подчеркнуть, что прежде чем вы посмотрите на контейнеры IoC, вы должны обойтись без одного. Выполните проводку и внедрение вручную, это не очень сложно или вообще не требует большого количества кода, если у вас нет действительно сложных или больших систем. Когда вы почувствуете, что понимаете это и что оно становится обременительным, вам будет легче понять, какие рамки вам помогут. но нет правила, гласящего, что проект ДОЛЖЕН иметь контейнер IoC, чтобы иметь возможность правильно выполнять DI.
Сара

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

Так как dotnetcore - это будущее, вы можете также использовать его встроенную поддержку DI. Это очень хорошо и очень настраиваемый.
ATL_DEV

Ответы:


340

редактировать (не автором): полный список IoC-структур доступен по адресу https://github.com/quozd/awesome-dotnet/blob/master/README.md#ioc :

  • Замок Виндзор - Замок Виндзор - лучший в своем классе зрелый контейнер Inversion of Control, доступный для .NET и Silverlight.
  • Unity - Легкий расширяемый контейнер внедрения зависимостей с поддержкой внедрения конструктора, свойства и вызова метода
  • Autofac - захватывающий контейнер .NET IoC
  • DryIoc - простой, быстрый, полнофункциональный контейнер IoC.
  • Ninject - ниндзя инжекторов зависимости .NET
  • StructureMap - оригинальный контейнер IoC / DI для .Net
  • Spring.Net - Spring.NET - это платформа приложений с открытым исходным кодом, которая упрощает создание корпоративных приложений .NET
  • LightInject - сверхлегкий контейнер IoC
  • Simple Injector - Simple Injector - это простая в использовании библиотека Dependency Injection (DI) для .NET 4+, которая поддерживает Silverlight 4+, Windows Phone 8, Windows 8, включая универсальные приложения и Mono.
  • Microsoft.Extensions.DependencyInjection - контейнер IoC по умолчанию для основных приложений ASP.NET.
  • Scrutor - Сборка сканирования расширений для Microsoft.Extensions.DependencyInjection.
  • VS MEF - реализация инфраструктуры управляемой расширяемости (MEF), используемая в Visual Studio.
  • TinyIoC - Простой в использовании, без проблем, Инверсия Контейнера Контроля для небольших проектов, библиотек и начинающих.

Оригинальный ответ следует.


Я полагаю, что здесь я немного придирчив, но важно отметить, что DI (Dependency Injection) является паттерном программирования и поддерживается, но не требует, IoC (Inversion of Control) каркасом. Платформы IoC просто делают DI намного проще и предоставляют множество других преимуществ, помимо DI.

Это, как говорится, я уверен, что это то, что вы спрашивали. О IoC Frameworks; Раньше я часто использовал Spring.Net и CastleWindsor , но настоящая боль в задних частях - это все те неприятные XML-конфигурации, которые вам приходилось писать! Сейчас они в основном движутся в этом направлении, поэтому я использую StructureMap в течение последнего года или около того, и с тех пор, как он перешел на свободную конфигурацию с использованием строго типизированных обобщений и реестра, моя проблема с использованием IoC упала до ниже нуля! Теперь я получаю абсолютное удовольствие, зная, что моя конфигурация IoC проверяется во время компиляции (по большей части), и у меня не было ничего, кроме радости от StructureMap и его скорости. Я не скажу, что другие работали медленно во время выполнения, но их было сложнее настроить, и разочарование часто выигрывало день.

Обновить

Я использовал Ninject в своем последнем проекте, и мне было очень приятно его использовать. Здесь слова меня немного подводят, но (как мы говорим в Великобритании) эта структура - «собаки». Я очень рекомендую его для любых проектов, связанных с зелеными полями, где вы хотите быстро приступить к работе. Я получил все, что мне было нужно, из фантастического набора Джастина Этереджа из Ninject. Я не могу видеть, что ретро-встраивание Ninject в существующий код является проблемой вообще, но то же самое можно сказать о StructureMap по моему опыту. Это будет трудный выбор между этими двумя, но я предпочел бы соревнование, чем стагнацию, и там есть приличное количество здоровой конкуренции.

Другие скриншоты IoC также можно найти здесь, на Dimecasts .


1
Приятно видеть качественный, хорошо продуманный ответ об одном вкладыше. Вы убедили меня проверить StructureMap.
Крис Марасти-Георг

7
Приятно, но, честно говоря, теперь у Windsor очень хороший, полноценный интерфейс.
Кшиштоф Козьмич

Не могли бы вы объяснить, что представляют собой структуры «множества других преимуществ» IoC помимо простой реализации DI?
fearofawhackplanet

@fearofawhackplanet Единственное, что может сделать контейнер IoC, чего нельзя сделать с помощью DI бедного человека, - это Перехват . Хорошее резюме здесь: kenneth-truyers.net/2013/05/16/…
Матье Гиндон

1
Я прочитал несколько источников, в которых говорится, что Ninject - самый медленный palmmedia.de/blog/2011/8/30/… и stackoverflow.com/questions/4581791/…
Люк Т О'Брайен

77

Это зависит от того, что вы ищете, так как у каждого из них есть свои плюсы и минусы.

  1. Spring.NETявляется наиболее зрелым, поскольку это происходит из весны из мира Java. Spring имеет очень богатый набор библиотек фреймворков, расширяющих его для поддержки Web, Windows и т. Д.
  2. Castle Windsorявляется одним из наиболее широко используемых в платформе .NET и обладает самой большой экосистемой, имеет широкие возможности конфигурирования / расширения, имеет настраиваемое управление временем жизни, поддержку AOP, имеет встроенную поддержку NHibernate и является универсальным контейнером. Виндзор является частью целого стека, который включает в себя монорельс, активную запись и т. Д. Сам NHibernate строится поверх Виндзора.
  3. Structure Map имеет очень богатую и мелкозернистую конфигурацию благодаря внутреннему DSL.
  4. Autofacпредставляет собой IoC-контейнер нового века со всей своей функциональной поддержкой программирования. Он также использует другой подход к управлению временем жизни, чем другие. Autofac все еще очень новый, но он ставит планку того, что возможно с IoC.
  5. Ninject Я слышал, больше голых костей с меньшим подходом (слышал не опытный).
  6. Самый большой дискриминатор Unity: это от и поддерживается Microsoft (p & p). У Unity очень хорошая производительность и отличная документация. Это также легко настраивается. Здесь нет всех наворотов, скажем, Карты Замка / Строения.

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


4
Autofac на самом деле не так уж нов, он старше, чем Unity :)
Николас Блумхардт

1
Я говорил, что это новее, чем Unity? Я сказал, что это новый век ... то есть я имел в виду его функциональный характер. Хорошо, то, что я сказал, это все еще очень ново, но я имел в виду, что это была природа, а не то, что она была новой. :-)
Гленн Блок

2
@Krzysztof - я нахожу Unity очень простым (по крайней мере, когда он свободно сконфигурирован в коде). Что ты нашел болезненным?
TrueWill


6
Вот интересный тест производительности: palmmedia.de/Blog/2011/8/30/…
Стивен,

35

Autofac. https://github.com/autofac/Autofac Это действительно быстро и довольно хорошо. Вот ссылка со сравнениями (сделано после того, как Ninject устранил проблему утечки памяти).

http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html


Мне нравится автофак, но это, конечно, не быстро. Как сказал Стивен выше: palmmedia.de/Blog/2011/8/30/…
Серж Саган,

18

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

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


1
Ninject популярен, но он, конечно, НЕ быстрый. Это на самом деле один из самых медленных: palmmedia.de/Blog/2011/8/30/…
Серж Саган,

13

Я использую простой инжектор :

Simple Injector - это простая, гибкая и быстрая библиотека внедрения зависимостей, в которой используются лучшие практики, чтобы направить ваши решения к вершине успеха.


4
Осторожно, некоторые считают сервис-локатор анти-паттерном, включая того, кто использовал его в течение некоторого времени и даже написал для него библиотеку: blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern
Филипп

4
Стивен также является создателем Simple Injector ... так что это своего рода спам-ответ ... тем более, что он использовал для этого альтернативные аккаунты ... Simple Injector довольно быстрый, хотя: palmmedia.de/Blog/2011/ 8/30 /…
Серж Саган

8

Я большой поклонник Касла. Мне нравятся возможности, которые он также предоставляет, помимо истории IoC Container. Это действительно упрощает использование NHibernate, logging, AOP и т. Д. Я также использую Binsor для конфигурации с Boo и действительно влюбился в Boo как язык из-за этого.


5

Я могу рекомендовать Ninject. Он невероятно быстр и прост в использовании, но только если вам не нужна конфигурация XML, иначе вам следует использовать Windsor.


1
Это НЕ быстро! Это одна из самых медленных платформ DI! palmmedia.de/Blog/2011/8/30/…
Серж Саган

@Serj Sagan Чтобы быть справедливым, эти результаты древние (сейчас 6 лет)
Тимоти Кански


5

Я потратил большую часть дня, борясь без успеха, чтобы получить самый простой пример Spring.NET. Никогда не мог понять, как заставить его найти мою сборку из файла XML. С другой стороны, примерно через 2 часа я смог заставить Ninject работать, включая тестирование интеграции с NUnit и MSTest.


4

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


2

Самое замечательное в C # заключается в том, что он шел по пути, проложенному годами разработчиками Java. Итак, мой совет, вообще говоря, при поиске инструментов такого рода, это искать надежный ответ на Java и посмотреть, существует ли еще адаптация .NET.

Поэтому, когда дело доходит до DI (а вариантов так много, это действительно дело вкуса), это Spring.NET . Кроме того, всегда разумно исследовать людей, стоящих за проектами. У меня нет проблем с предложением продуктов SourceGear для контроля версий (вне их использования), потому что я уважаю Эрика Синка. Я видел, как говорил Марк Поллак, и что я могу сказать, парень просто получает это.

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

Удачи!


2

Я думаю, что хорошее место для старта - Ninject, он новый, с большим количеством настроек и очень быстрым. У Нейта, разработчика, действительно отличный сайт и отличная поддержка.


Почему ты говоришь, что это быстро ??? Это один из самых медленных, что есть! palmmedia.de/Blog/2011/8/30/…
Серж Саган

2

Spring.Net довольно солидный, но документация заняла некоторое время, чтобы разобраться. Autofac хорош, и, хотя .Net 2.0 поддерживается, вам нужно VS 2008 для его компиляции или использовать командную строку для сборки вашего приложения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.