Виндзорские перехватчики AOP и кэширование
-
01-07-2019 - |
Вопрос
Я рассматриваю возможность использования перехватчиков Castle Windsor для кэширования данных, чтобы помочь масштабировать сайт asp.net.
У кого-нибудь есть какие-нибудь мысли / опыт по поводу этого?
Незначительное уточнение:Мое намерение состояло в том, чтобы использовать Windsor для перехвата "дорогих" вызовов и делегирования MemCacheD или Velocity (или другому распределенному кэшу) для самого кэширования.
Решение
Я использую декораторы кэширования (не перехватчики) в Windsor, и они отлично работают.
Перехватчики тоже хороши для этого, см. это например.
Другие советы
Привет всем, мы использовали перехватчики Castle Windsor, основываясь на этой статье: http://www.davidhayden.com/blog/dave/archive/2007/03/14/CastleWindsorAOPPolicyInjectionApplicationBlock.aspx так же, как и тот, о котором говорилось выше.
Я нашел все это довольно простым, и это очень элегантный способ сделать AOP.Однако....
Однако будьте осторожны с производительностью.Использование перехвата создает динамический прокси-сервер, который определенно замедлит работу.Основываясь на наших тестах с использованием вычислительной фермы на 500 узлов, мы увидели снижение производительности примерно на 30% при использовании перехвата в Windsor, это также выходило за рамки того, что мы делали внутри перехвата (по сути, регистрировали вызовы методов и параметры, передаваемые в наши methdods).и простое удаление перехвата немного ускорило работу всего приложения.
Будь осторожен, не делай своих дорогостоящих звонков в самом деле дорого.:) На вашем месте я бы посмотрел на кэширование на другом уровне, возможно, путем реализации шаблона типа IRepository, а затем подкрепил его различными стратегиями кэширования, где это уместно.
Удачи вам,
--
Мэтт.
Как вы реализуете свой доступ к данным?Если вы используете NHibernate, я бы предложил кэшировать здесь.NHibernate поставляется со стратегиями кэширования для .Встроенный кэш NET, memcached (через NMemcachD) и Velocity.Я широко использовал memcached для приложений корпоративного уровня, и у меня не было с этим проблем.
Механизм кэширования на основе перехватчика - интересная идея, о которой я раньше не думал.Его было бы очень легко прозрачно нанести.Единственное, что мне нравится в использовании функций AOP Castle, - это то, что они основаны на прокси, вам не нужно загрязнять свой код атрибутами.
Я бы посмотрел на Скорость Microsoft.Если вы планируете создать корпоративное приложение, это может быть хорошим решением
Я создал проект с открытым исходным кодом под названием кэшью.каслвиндзор с помощью перехватчика кэширования.Это универсальное решение для кэширования.
Вот простой пример использования:
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>());
Поведение по умолчанию заключается в кэшировании всех методов, которые начинаются с Get и возвращают данные, но вы также можете изменить, какие префиксы кэшировать.
Проект доступен на nuget:http://www.nuget.org/packages/Cachew .Каслвиндзор/
А исходный код доступен здесь:https://github.com/kobbikobb/Cachew
Windsor - это здорово, но зачем использовать его для кэширования, когда у вас есть несколько встроенных способов кэширования данных.Windsor имеет свою основу в других областях, не обязательно в кэшировании.От объекта кэша к сеансу и к файлам cookie.Существует много способов кэширования.Что еще более важно, в больших приложениях вам в конечном итоге потребуется распределенное кэширование.MS работает над продуктом для этого, и есть пара хороших поставщиков, у которых есть продукты на рынке.