После посещения недавней группы Alt.NET на IoC я подумал о доступных инструментах и о том, как они могут работать. StructureMap
в частности использует оба атрибута и понятия начальной загрузки для сопоставления запросов для IThing
до ConcreteThing
. Атрибуты автоматически меняют флаги для меня, что происходит либо рефлексия, либо инъекция IL. Кто-нибудь знает, как это работает (для StructureMap
или других инструментов IoC) и какие связанные с этим накладные расходы могут быть либо во время выполнения, либо во время компиляции?Что такое накладные расходы, связанные с контейнерами IoC, такими как StructureMap?
ответ
Я не могу сказать много для других наборов инструментов IoC, но я использую Spring.Net и обнаружил, что при запуске есть одна начальная оценка производительности. После настройки контейнера приложение запускается без изменений.
Основная проблема заключается в том, что код становится трудно понять. Это может стать чистым магическим если один overuse IoC. Другая проблема - производительность. В большинстве случаев потеря производительности не заметна. Но когда вы начинаете создавать большинство своих объектов через контейнер IoC, он может внезапно опуститься ниже уровня океана.
Насколько велика может быть потеря производительности? Что вы измерили? – Rookian 2010-07-23 20:22:45
Я использую Windsor от CastleProject и нашел его чрезвычайно полезным в уменьшении зависимостей. Я еще не заметил проблемы с производительностью, но одна вещь, которую я нахожу, заключается в том, что конфигурация может стать немного громоздкой. Чтобы помочь в этом отношении, я начинаю смотреть на Binsor, который является DSL для Windsor, написанным в boo.
Еще одна вещь, о которой стоит помнить, заключается в том, что при навигации по коду вы не сможете перейти к коду, который будет выполняться во время выполнения.
Я построил очень легкий и основной IOC, здесь:
http://blogs.microsoft.co.il/blogs/shay/archive/2008/09/30/building-custom-object-mapper.aspx
Это не альтернатива библиотекам вы упомянули, но если все, что Вам нужно, чтобы разрешить тип, давая его интерфейс это может быть идеальным решением.
Я не обрабатывать типы Инстанцирование (Singleton, преходящие, нить, бассейн ...), все объект будет экземпляр, как одиночек, вы называете это нравится:
IRepository _repository = ObjectFactory.BuildFactory<IRepository>();
Шей
Спасибо. ..Я действительно не слышал о Spring.Net, вам это нравится? – 2008-09-12 00:29:11