2009-10-29 3 views
8

Я использую Injection Dependency в своем коде (с Ninject) и думал, что делаю все хорошо, пока не столкнулся с проблемой производительности, вызванной неправильным пониманием того, где контейнеры DI вписываются в ваш код. Кажется, есть много информации о том, как использовать рамки DI, но не слишком много, чтобы не использовать их или как их использовать (по крайней мере, что я мог найти)Рекомендации по впрыскиванию зависимостей

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

  • Используйте одно ядро ​​для каждого приложения или AppDomain
  • Используйте DI контейнер для долгоживущих Singleton только объекты, использовать заводы (или другие методы) для короткоживущих временных объектов)
  • Предпочитают Constructor Injection по недвижимости или полевая инъекция
  • Запросить объекты, не строить их
  • другие ?? указатели на хороший блог
+0

Что такое ядро? что конкретная концепция Ninject (нигде не видели)? – zvolkov

+0

также, сборщик против инъекций конструктора является религиозным аргументом и как таковой следует избегать. – zvolkov

ответ

7

Вот краткий перечень наиболее важных пунктов (некоторые из которых также появляются в OP):

  • Кодекс должен быть не знают о которых DI контейнер (если таковые имеются) используется
  • Compose все приложение в корне приложения (композиция Root)
  • Фавор Constructor Injection

Я не могу сказать, что я согласен с вашей точкой об объектах Singleton и Transient. Вся точка DI заключается в том, что внешний механизм (такой как контейнер DI) определяет время жизни любой данной зависимости, а не кого-то другого, поэтому вам нужно иметь все зависимости, управляемые контейнером DI.

+0

Привет, Марк, см. Обсуждение здесь (http://groups.google.com/group/ninject/browse_thread/thread/41ec03527da9f0f8) о производительности Ninject в приложениях. Как и вы, я думал, что контейнер DI должен использоваться повсюду, но накладные расходы на контейнеры DI таковы, что создание большого количества переходных объектов может быть навязчивым. Ваш совет отлично подходит для веб-приложений, возможно, но не в других областях. –

+0

Я просмотрел эту дискуссию, но я думаю, что согласен с Нейтом. DI следует использовать для разрешения и ввода зависимостей, но если вы создаете сотни тысяч объектов через контейнер DI, что-то не так с общим дизайном. Это никогда не было целью DI. Я мог бы добавить еще один маркер в свой список: «Желательно развязать изменчивые зависимости от стабильных зависимостей», но это скорее общая рекомендация по дизайну, чем конкретная вещь DI. –

+2

Я согласен с переходными объектами - большинство приложений, использующих DI, создают большое количество переходных объектов. Некоторые контейнеры (Unity и вскоре Autofac 2) по умолчанию используют переходный режим, а не Singleton. Я не думаю, что «предпочитают одиночные игры» можно рассматривать как наилучшую практику - это скорее похоже на комментарий о производительности конкретного контейнера в конкретном сценарии. –

4

Используйте контейнер DI для долгоживущего Singleton только объекты, использовать заводы (или другие методы) для короткоживущих временных объектов)

Но использовать DI впрыснуть заводы Into там, где нужно ,

 Смежные вопросы

  • Нет связанных вопросов^_^