У замка Виндзор есть минусы?

Я изучал проект «Замок» и, в частности, Виндзор. Я был так впечатлен тем, что возможно с этой технологией, и преимущества наличия такой слабосвязанной системы определенно очевидны. Единственное, в чем я не уверен, - есть ли у этого метода какие-либо недостатки, особенно в asp.net? например хиты производительности и т. д.

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

  1. Это использует отражение, и каждый раз, когда объект вызывается из контейнера, отражение должно использоваться, поэтому производительность будет ужасной. (Это так? Используется ли отражение при каждом вызове?)

  2. Если я полагаюсь на интерфейсы; как мне работать с объектами, у которых есть дополнительные методы и свойства, прикрепленные к классу? (по наследству)

форумы.asp.net/t/1488120.aspx
pravprab 19.02.2014 14:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
35
1
7 575
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Одна проблема с Castle Windsor, с которой я столкнулся, заключается в том, что он не может работать в Medium Trust (без перекомпиляции, которую я не смог сделать). Поэтому мне нужно было переключиться с Windsor на Unity.

Согласно производительности DI / IoC - я считаю, что падение производительности невелико, особенно если иметь в виду его мощность.

Кстати: если вы начинаете с DI / IoC, вам следует прочитать эта статья MSDN.

О компиляции Windsor для работы на Medium Trust, возможно, это поможет: vhendriks.wordpress.com/2007/11/21/monorail-on-shared-hostin‌ g

Mauricio Scheffer 26.12.2008 20:53

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

Более важным недостатком является то, что проблемы интеграции не обнаруживаются во время сборки, а некоторые даже при запуске. Без тщательного отслеживания версий всех модулей и постоянного тестирования всей системы легко попасть в беду. Здесь помогает отражение, поэтому Windsor лучше в этом аспекте, чем многие другие фреймворки DI.

По поводу производительности смотрите эти статьи:

Но помните, что у некоторых из этих контейнеров есть более новые (и, возможно, более быстрые) версии, особенно Unity.

интересное чтение в качестве сравнения фреймворков IOC (что здорово), но последний график по первой ссылке показывает, что падение производительности при использовании IOC по сравнению с "новым" значительно

annakata 23.12.2008 13:17

Определенно, он должен быть медленнее, чем простой оператор new. Я согласен с тем, что операции, критичные к скорости, должны выполняться без DI / IoC. Но в большинстве случаев это хорошо для получаемых способностей.

gius 23.12.2008 13:25

Кроме того, подумайте об абсолютном времени создания нового экземпляра. Даже если с DI / IoC требуется в 10 раз больше времени, я думаю, что это не узкое место приложения (если вы не создаете миллионы экземпляров), и снижение производительности не является значительным (по сравнению с другими операциями).

gius 23.12.2008 13:29

увы, меня действительно беспокоит приложение, создающее миллионы экземпляров, поэтому я зациклен на цифрах - думаю, я попробую Windsor в следующем проекте :)

annakata 23.12.2008 13:58

Виндзор - хорошее место для начала. Теперь я использую Unity (лучше для использования с Enterprise Library и Medium trust)

gius 23.12.2008 14:13

Скорость контейнеров IoC не является проблемой для подавляющего большинства приложений. Характеристики каждого контейнера способ более важны для сравнения.

Mauricio Scheffer 24.12.2008 16:18

Я использовал контейнеры IoC (Spring.NET и StructureMap) в нескольких производственных приложениях при высокой нагрузке (не на Facebook / MySpace, но достаточно, чтобы вывести из строя несколько серверов).

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

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

Это похоже на людей, которые сравнивают снижение производительности оператора new () и Activator.CreateInstance () за 1–10 мс, когда один обход БД обычно на порядок дороже.

Я бы посоветовал вам не беспокоиться о мелочах и сосредоточиться на большом.

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

Хэмметт совершил Component Burden пару месяцев назад (mail-archive.com/[email protected]/…)

Mauricio Scheffer 24.12.2008 16:22

-1. получение ресурсов - это инициализация; как вы можете проверить время жизни ваших объектов, если нет метаданных о стиле жизни, которые распространяются через вызов разрешения? Или как насчет одноразовых объектов, которые зависят от того, что вы разрешаете; как бы вы выполнили их вручную? Это не недостаток. В MVC, например Часть выпуска связана либо с контроллером, либо с образом жизни по запросу, и Виндзор обрабатывает это за вас!

Henrik 12.04.2011 16:30

Я использовал StructureMap и Windsor, а с Windsor мне пришлось гораздо больше возиться с жизненными циклами и настраивать их. С StructureMap это просто работает. Он обрабатывает все те же сценарии, но более очевидным образом. Виндзор заставляет задуматься об этом больше, в чем нет необходимости в 99% случаев.

chadmyers 18.04.2011 19:52
Ответ принят как подходящий

Чтобы ответить на ваши вопросы:

  1. That is using reflection and each time that an object is called from the container, reflection must used so performance will be terrible. (Is this the case? does it use reflection on every call?)
  • Нет. В большинстве случаев при регистрации компонента используется небольшое отражение. Он также может использовать отражение при генерации типа прокси, когда вы впервые запрашиваете компонент из контейнера.
  1. If I am relying on Interfaces; how do I deal with objects that have extra methods and properties which have been tacked onto the class? (through inheritance)
  • Все дело в дизайне. Вы не хотите, чтобы каждый объект создавался контейнером. Вы используете его в первую очередь для служебных зависимостей. В этом случае вас не волнует, какой тип на самом деле скрывается за интерфейсом (в этом весь смысл, не так ли?).

Вы также можете иметь компоненты класса, но у них есть ограничения, и вы должны знать о них (например, вы не можете перехватывать вызовы невиртуальных методов). Я считаю Windsor наиболее зрелым и наиболее подходящим для моего стиля разработки.

Кроме этого, «Производительность», я не слышал о проекте, в котором пришлось бы отказаться от контейнера зависимостей из-за неприемлемой производительности. Windsor действительно умен и кэширует результаты длительных операций, так что вам не придется платить дважды. В Интернете можно найти диаграммы, сравнивающие скорость многих контейнеров IoC. В связи с этим следует отметить две вещи: все контейнеры действительно быстрые. Не думайте, что тот факт, что другие контейнеры быстрее на этих графиках, чем Виндзор, означает, что они лучше. Виндзор делает для вас много чего, чего не делают другие контейнеры.

Последующий вопрос здесь. stackoverflow.com/questions/2216684/…

Quintin Par 07.02.2010 13:35

Согласованы по производительности, так как это может быть действительно низко висящий фрукт, если вы просто найдете более быстрый контейнер. Взгляните на этот пост в блоге для более подробной информации - после прочтения я переключился на Funq и увидел приличный выигрыш: palmmedia.de/blog/2011/8/30/…

Doug 14.10.2013 04:01

Единственное исключение, когда производительность контейнера IoC неприемлема, по моему опыту, - это попытка интегрировать / обернуть контейнер IoC как IServiceProvider для использования в ComponentModel - когда-то распространенным примером этого было создание собственного размещенного конструктора winforms (обычно для создать своего рода нестандартный дизайнер, например рабочий процесс / блок-схему и т. д.)

Из-за особенностей поведения ряда компонентов winforms, особенно во время разработки, стоимость разрешения компонента физически заставит мышь "заикаться" при перетаскивании, потому что фреймворк может выполнять до 30 000 вызовов разрешения службы в секунду - это больше. размышления о плохой практике кодирования в самих компонентах, хотя я думаю, или, по крайней мере, из-за предположений, сделанных о том, что реализация поставщиков услуг будет быстрой / простой.

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

  1. That is using reflection and each time that an object is called from the container, reflection must used so performance will be terrible. (Is this the case? does it use reflection on every call?)

Насколько известно, все хорошие контейнеры (включая Castle Windsor) действительно используют отражение для создания новых экземпляров. Однако это улучшение производительности. Это для сравнения с Activator.CreateInstance, который работает намного медленнее. Некоторые другие контейнеры довольно быстрые и могут составить конкуренцию новому оператору. См. Сравнительный тест здесь. Castle Windsor не из самых высокопроизводительных, но скорость не особо важна. Когда дело доходит до использования IoC в приложении. 90% ваших классов должны быть установлены как синглтоны, а это означает, что они будут работать только при запуске вашего приложения.

  1. If I am relying on Interfaces; how do I deal with objects that have extra methods and properties which have been tacked onto the class? (through inheritance)

Попробуйте эти руководства по руководство и это. Это откроет ответ на ваш вопрос. Если вы хотите избежать проблем с дизайном и простое в обслуживании программное обеспечение, я настоятельно рекомендую использовать ТВЕРДЫЕ практики.

Другие вопросы по теме