Я ищу простой, но практичный и надежный каркас IOC / DI для .net - PullRequest
3 голосов
/ 03 февраля 2010

Я собираюсь использовать его в проекте с менее опытными разработчиками, поэтому такая сложная среда, как Spring.NET, не подходит. Я думал о:

  1. Ninject
  2. Замок Виндзор
  3. StructureMap

Что представляет собой умеренную кривую обучения без потери гибкости?

и еще вопрос - где правильное место для конфигурации? Поскольку ядро ​​/ конфигурация в 3-уровневом приложении ASP.NET (не MVC !!!, во всех примерах используется MVC :))

Ответы [ 11 ]

4 голосов
/ 04 февраля 2010

Самое замечательное в правильном использовании DI заключается в том, что вы можете отложить принятие решения о том, какой DI-контейнер использовать, до последнего ответственного момента . В терминах архитектуры приложения это соответствует так называемому Composition Root , в котором вы объединяете все зависимости. Это часто точка входа приложения .

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

Когда дело доходит до выбора DI-контейнера, мне известны следующие DI-контейнеры для .NET:

Лично я до сих пор доволен Касл Виндзор, но мне еще предстоит получить обширный опыт работы со всеми этими контейнерами.

2 голосов
/ 04 февраля 2010
0 голосов
/ 05 марта 2010

Если вы еще знакомы с любой структурой DI, я бы пошел с Simple Injector .

У него очень простой API, который поможет вам быстро начать работу. Несмотря на простоту, он по-прежнему поддерживает многие сценарии расширенной настройки . Библиотека разработана с учетом миграции, а это означает, что переключение на другую инфраструктуру будет довольно простым. Чтобы доказать это, в вики проекта .

есть руководство по миграции .
0 голосов
/ 26 февраля 2010

Мы используем управляемую платформу расширяемости . Он является частью .NET 4.0 framework (в настоящее время в версии-кандидате), где его можно найти в пространстве имен System.ComponentModel.Composition . Сайт Codeplex в настоящее время по-прежнему является лучшим источником документации.

В MEF больше внимания уделяется «расширяемости», а не «внедрению зависимостей», но для этого используется внедрение зависимостей. Например, редактор кода Visual Studio 2010 использует MEF для обеспечения расширяемости.

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

0 голосов
/ 04 февраля 2010

Взгляните на http://funq.codeplex.com/, во-первых, он чрезвычайно быстр по сравнению с виндзорскими и другими отражающими контейнерами, во-вторых, он очень гибкий, но все же имеет очень удобочитаемую конфигурацию (если вы разбираетесь в Lambaвыражения, которые должны занять много времени)

0 голосов
/ 04 февраля 2010

Autofac - мой контейнер на выбор. Это позволяет регистрироваться через лямбда-выражения для максимальной гибкости (ссылка имеет несколько хороших примеров).

Имеется версия, совместимая с Silverlight. Я не уверен, что другие контейнеры это делают.

Что касается размещения, контейнер должен быть собран во время запуска приложения. Для приложения ASP.NET это должно быть в методе Global.Application_Start.

Autofac имеет интеграцию ASP.NET , которая внедряет экземпляры страниц, используя контейнер, созданный при запуске.

0 голосов
/ 03 февраля 2010

Я считаю StructureMap очень полезным и интуитивно понятным в использовании.Я немного поиграл с Ninject и нашел, что это менее удобно, но YMMV.Я также рекомендую вам использовать общий сервисный локатор в качестве посредника между фактической реализацией вашего IOC и вашего приложения.Когда вы захотите позже переключить свой контейнер IOC / DI, это будет менее болезненно.Есть адаптеры для StructureMap и Castle Windsor.И я думаю, из Google, что есть также адаптер для Ninject 2 в соответствии с этим блог .

0 голосов
/ 03 февраля 2010

В дополнение к Ninject, который является отличным продуктом, есть еще две опции, с которыми я знаком:

  1. Unity от Microsoft .Некоторые люди из Alt.NET думают, что это немного сложнее и сложнее.Я использую его уже несколько месяцев как часть Prism (Prism НЕ обязан использовать Unity. Он доступен отдельно), и я обнаружил, что он простой и понятный.
  2. StructureMap .Я обнаружил, что StructureMap также имеет очень мягкую кривую обучения с быстрым наращиванием.

Надеюсь, это поможет.

0 голосов
/ 03 февраля 2010

Я думаю, вы слишком торопитесь, чтобы отвергнуть spring.net. Spring предлагает чрезвычайно гибкую кривую обучения, поэтому в начале это своего рода подход «возьми, что хочешь».
Вы можете начать с самого простого из всех IoC-контейнеров, а затем перейти к aop, транзакциям, модульному тестированию или к чему угодно, поэтому сложность постепенно нарастает.

Это был # 1 пункт продажи на моих последних двух работах за использование Spring. Дополнительные баллы:

  • Это не заставляет вас использовать его API или изменять архитектуру. Опять же, это заставляет вас адаптировать его функции в своем собственном темпе.
  • Очень обширная документация.

Когда проект повзрослеет, так же как и ваши разработчики, так что весна в конце пригодится ... (на мой взгляд, бесплатно в начале)

0 голосов
/ 03 февраля 2010

Подумайте, чтобы начать с проводки вручную: см. http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion. Это дает менее опытным разработчикам лучшее понимание основ IOC / DI.

...