Использование переходных фабрик в Castle Windsor

Если вы используете TypedFactoryFacility в Windsor для создания фабрик на основе интерфейса, сама фабрика может быть зарегистрирована как Transient. Получается, что фабрика затем выпустит все временные объекты, которые она создала, когда сама фабрика будет утилизирована после выпуска.

container.AddFacility<TypedFactoryFacility>();
container.Register(
    Types.FromThisAssembly().BasedOn<IFactory>().Configure(
        x => x.AsFactory()).LifestyleTransient());

Это означает, что если я создам автоматически сгенерированные фабрики как временные, это аккуратно позволит мне забыть о Releaseing объекте, созданном из фабрики (конечно, пока я управляю временем жизни самой фабрики). Время жизни такой временной фабрики будет привязано к какому-то другому временному объекту, поэтому, когда этот объект освобождается, освобождается и фабрика, и все, что эта фабрика создала.

Лично я ненавижу помнить о явном Release() объектах, и это сильно очищает код, так что это меня очень радует. Но вопрос в том, является ли это разумной практикой? Все это кажется слишком простым.

Есть ли недостаток в создании нового экземпляра фабрики каждый раз, когда требуется фабрика?

Я копаю себе ужасную яму?


person Mark    schedule 16.01.2015    source источник


Ответы (2)


Механизм автоматической фабрики в Castle основан на Castle.DynamicProxy; Я предполагаю, что если вы используете фабрику в качестве временного компонента, вам придется платить за создание ProxyGenerator при каждом разрешении, если только не существует какого-либо другого механизма кэширования.

документация предостерегает от повторного создания ProxyGenerator каждый раз:

Если у вас есть долго работающий процесс (веб-сайт, служба Windows и т. д.) и вам нужно создать много динамических прокси-серверов, вы должны обязательно повторно использовать один и тот же экземпляр ProxyGenerator. Если нет, имейте в виду, что вы обойдёте механизм кэширования. Побочными эффектами являются высокая загрузка ЦП и постоянное увеличение потребления памяти.

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

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

person samy    schedule 19.01.2015
comment
Хорошая мысль. На самом деле это было одной из вещей, которые меня беспокоили. Я провел некоторые эксперименты, как проверяя сгенерированный динамический прокси, так и выполняя некоторые тесты в отладчике... Похоже, что прокси-функции генерируются только один раз, поэтому создание и выпуск 2 миллиардов фабрик в цикле не расширяет использование памяти. Однако для завершения работы с использованием всего ядра требуется около 2 минут. Я думаю, что я могу жить с этой пропускной способностью. - person Mark; 19.01.2015
comment
У Windsor есть только один экземпляр PG, так что это не должно быть проблемой. - person hammett; 20.01.2015
comment
@HamiltonVerissimo Спасибо за информацию. У меня не хватило смелости копаться и проверять себя, но звучало логично использовать какой-нибудь долгоживущий генератор. - person samy; 20.01.2015
comment
На самом деле, если вам нужны подробности, у Windsor есть своя собственная группа размещения, которую она использует всякий раз, когда необходимо проксировать компоненты (перехватчики != пусто), но предприятия, такие как автомобильный завод, вероятно, создадут свои собственные. - person hammett; 22.01.2015

Итак, более глубокий вопрос связан с IDisposable. Почему вы его используете? Вы действительно отслеживаете неуправляемые/ограниченные ресурсы? Вы используете его, чтобы действительно что-то утилизировать или как протокол выключения?

Все это исчезнет, ​​если вы измените политику выпуска Windsor, что заставит вас позаботиться о том, когда/если [для] вызова dispose. Контейнер пытается помочь вам, отслеживая, что и когда утилизировать, но он может сделать очень мало, поэтому иногда лучше взять на себя ответственность.

Другой вариант — отключить отслеживание и открыть службу, которая отслеживает вещи, которые нужно утилизировать. Это может быть более семантическим и понимать потребности вашего бизнеса/инфраструктуры.

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

person hammett    schedule 17.01.2015
comment
Я не реализую disposable для временных объектов, созданных фабрикой, хотя я хочу, чтобы они подвергались сборке мусора, когда на них больше не ссылаются. Обычно, когда вы используете фабрику для создания объектов, они недолговечны — в моем случае они выпадают из области видимости, когда запрос завершает обработку. - person Mark; 19.01.2015