Каковы различия между LinFu.DynamicProxy и Castle.DynamicProxy?
Я смотрю на добавление логики в библиотеку, над которой я работаю, что потребует наличия динамического прокси. Я хотел бы получить совет от пользователя, который использовал эти две библиотеки в производственной среде. Выполняет ли один другой другой, были ли какие-то недостатки, которые заставляли вас переключаться на другие и т. Д. В основном, расскажите мне о своем опыте работы с библиотекой. Ответы помогут мне решить, какой из них использовать.
-- Редактировать --
Я забыл упомянуть, что библиотека, которую я разрабатываю, будет поддерживать Mono, поэтому любые знания, которые вы можете поделиться о двух библиотеках и их поддержке Mono, также будут хорошими.
3 ответа
Я являюсь приверженцем Касла, участвуя в работе Динамического прокси, поэтому я могу быть предвзятым, но в целом я считаю, что Динамический прокси Касла является гораздо лучшим решением. Я говорю здесь о LinFu Dynamic Proxy v1.0, потому что это то, с чем я знаком. LinFu.Proxy 2 основан на Mono.Cecil и переписан с нуля.
- Замок охватывает более широкий спектр сценариев.
- У Castle есть (намного) большая пользовательская база, и это доказано во многих OSS и коммерческих приложениях
- Замок на самом деле работает лучше ( ссылка)
- У Castle есть более чистый и простой в использовании API, например, вызов метода target для Castle Dynamic Proxy выглядит следующим образом:
invocation.Proceed();
для LinFu это выглядит так (реальное имя метода / свойства может отличаться, так как я пишу это из памяти)
//invocation.TargetMethod is MethodInfo, so you're using reflection
invocation.TargetMethod.Invoke(invocation.Target,invocation.Parameters);
- Замок имеет активную группу пользователей, где вы можете быстро получить ответы на свои вопросы.
Проблема производительности, упомянутая в другом ответе, не является проблемой Dynamic Proxy, но является результатом ошибки в реализации Microsoft BCL (в Mono такой проблемы нет, кстати). Это проявляется только тогда, когда у вас есть много (более 200) типов прокси в одном ModuleScope.
Решение тривиально - не генерируйте столько прокси-типов (как правило, вам не нужно) или используйте много ModuleScopes/ProxyGenerators (например, Rhino.Mocks использует этот подход)
Лично я не занимаюсь разработкой на Mono, поэтому у меня нет личного опыта, однако есть библиотеки, использующие Castle DP на Mono, и у нас не было никаких нареканий, поэтому я думаю, что это работает просто отлично.
Со времени моего теста несколько месяцев назад не было выпущено новой версии Castle DP (новая версия намечена на конец года). У LiFu есть версия 2.0, но я не уверен, что она только магистральная или выпущена. Я не знаю о весне или единстве.
Linfu является более легким прокси-генератором, чем прокси-генератор Castle.
При принятии решения, что использовать, если честно, это не имеет большого значения.
По мнению автора, Linfu значительно превосходит генератор Castle, но, по моим собственным наблюдениям, в реальном мире разница в скорости незначительна.
Сказав, что Линьфу превзойдет Касла, я не знаю ничего, что Касл имеет над этим, и поэтому я всегда использую Линфу.
У нас были некоторые проблемы, связанные с LinFu vs Castle в 2.0.1. http://niemware.blogspot.com/2009/11/nhibernate-21-performance-issues-with.html