#.net #castle-windsor #aop
Вопрос:
Я рассматриваю возможность использования перехватчиков замка Виндзор для кэширования данных, чтобы помочь масштабировать asp.net сайт.
У кого-нибудь есть какие-либо мысли/опыт по этому поводу?
Незначительное уточнение: Мое намерение состояло в том, чтобы использовать Windsor для перехвата «дорогих» вызовов и делегирования в MemCacheD или Velocity (или другой распределенный кэш) для самого кэширования.
Ответ №1:
Привет, мы использовали перехватчики замка Виндзор, основываясь на этой статье: http://www.davidhayden.com/blog/dave/archive/2007/03/14/CastleWindsorAOPPolicyInjectionApplicationBlock.aspx так же, как и упомянутый выше.
Я нашел все это довольно простым, и это очень элегантный способ сделать АОП. Однако….
Однако будьте осторожны с производительностью. Использование перехвата создает динамический прокси-сервер, который определенно замедлит работу. Основываясь на наших тестах с использованием вычислительной фермы с 500 узлами, мы увидели снижение производительности примерно на 30% при использовании перехвата в Виндзоре, это было за пределами того, что мы делали внутри перехвата (по сути, регистрируя вызовы методов и параметры, передаваемые нашим methdods). и простое удаление перехвата немного ускорило работу всего приложения.
Будьте осторожны, чтобы ваши дорогие звонки не были действительно дорогими. 🙂 На вашем месте я бы попытался кэшировать на другом уровне, возможно, реализовав шаблон типа IRepository, а затем, при необходимости, подкрепив его различными стратегиями кэширования.
Удачи,
—
Мэтт.
Комментарии:
1. Я не могу быть уверен, но перехват, похоже, сильно ускорился в версии 3.0
Ответ №2:
Я использовал декораторы кэширования (не перехватчики) с Windsor, и они отлично работают.
Перехватчики также хороши для этого, см., например, это.
Комментарии:
1. Спасибо, Мауш. Я тоже пошел по пути декоратора.
2. Кэширующие декораторы? Чем это отличается от перехватчиков? в плане его декларирования с использованием свободной регистрации? Примеры, пожалуйста.
3. Было бы здорово иметь пример этих декораторов.
Ответ №3:
Как вы реализуете свой доступ к данным? Если вы используете NHibernate, я бы предложил кэшировать здесь. NHibernate поставляется со стратегиями кэширования для .ЧИСТЫЙ встроенный кэш, memcached (через NMemcachD) и скорость. Я широко использовал memcached для приложений корпоративного уровня, и у меня не было проблем с этим.
Механизм кэширования на основе перехватчика-интересная идея, о которой я раньше не думал. Это было бы очень легко прозрачно применить. Единственное, что мне нравится в использовании функций AOP в Castle, — это то, что он основан на прокси, вам не нужно загрязнять свой код атрибутами.
Комментарии:
1. спасибо, Крис, к сожалению, только небольшая часть данных поступает из NHibernate. Большая часть данных поступает из Sharepoint, и существует необходимость в агрегировании метаданных по нескольким спискам (не спрашивайте :-))
Ответ №4:
Я бы посмотрел на скорость Microsoft. Если вы планируете создать корпоративное приложение, это может быть хорошим решением
Ответ №5:
Я создал проект с открытым исходным кодом cachew.castlewindsor с перехватчиком кэширования. Это решение общего назначения для кэширования.
Вот простой пример использования:
var container = new WindsorContainer();
container.Register(Component.For<CacheInterceptor>()
.Instance(new CacheInterceptor(new Cache(TimeoutStyle.RenewTimoutOnQuery, TimeSpan.FromSeconds(3)))));
container.Register(Component.For<IServer>().ImplementedBy<Server>().Interceptors<CacheInterceptor>());
Поведение по умолчанию заключается в кэшировании всех методов, которые начинаются с получения и возврата данных, но вы также можете изменить, какие префиксы кэшировать.
Проект доступен на nuget: http://www.nuget.org/packages/Cachew.Каслвиндсор/
А исходный код доступен здесь: https://github.com/kobbikobb/Cachew
Ответ №6:
Виндзор-это здорово, но зачем использовать его для кэширования, когда у вас есть несколько встроенных способов кэширования данных. Виндзор имеет свое основание и в других областях, не обязательно связанных с кэшированием. От объекта кэша к сеансу и к файлам cookie. Существует множество способов кэширования. Что еще более важно, в больших приложениях вам в конечном итоге потребуется распределенное кэширование. MS работает над продуктом для этого, и есть пара хороших поставщиков, у которых есть продукты на рынке.
Комментарии:
1. Спасибо, Томас. Мое намерение состояло в том, чтобы использовать Windsor для перехвата «дорогих» вызовов и делегирования MemCacheD или Скорости для самого кэширования.