我正在考虑将逻辑添加到我正在处理的库中,这需要动态代理。我想从在生产环境中使用这两个库的用户那里得到一些建议。一个能胜过另一个,是否有任何缺点让你不得不切换到另一个,等等。基本上告诉我你在图书馆的经历。答案将帮助我决定使用哪一个。
- 编辑 -
我忘了提到我正在开发的库将支持 Mono,因此您可以分享关于这两个库的任何知识以及它们对 Mono 的支持也会很棒。
我正在考虑将逻辑添加到我正在处理的库中,这需要动态代理。我想从在生产环境中使用这两个库的用户那里得到一些建议。一个能胜过另一个,是否有任何缺点让你不得不切换到另一个,等等。基本上告诉我你在图书馆的经历。答案将帮助我决定使用哪一个。
- 编辑 -
我忘了提到我正在开发的库将支持 Mono,因此您可以分享关于这两个库的任何知识以及它们对 Mono 的支持也会很棒。
我是 Castle 的提交者,为 Dynamic Proxy 做贡献,所以我可能有偏见,但我通常认为 Castle 的 Dynamic proxy 是更好的解决方案。我在这里说的是LinFu DynamicProxy v1.0,因为那是我熟悉的。LinFu.Proxy 2 基于 Mono.Cecil 并从头开始重写。
invocation.Proceed();
对于 LinFu,它看起来像这样(实际的方法/属性名称可能会有所不同,因为我是从内存中写出来的)
//invocation.TargetMethod is MethodInfo, so you're using reflection
invocation.TargetMethod.Invoke(invocation.Target,invocation.Parameters);
另一个答案提到的性能问题不是 DynamicProxy 问题,而是微软 BCL 实现中的错误的结果(顺便说一句,在 Mono 上没有这样的问题)。只有当您在单个 ModuleScope 中有许多(超过 200 多个)代理类型时,才会出现这种情况。
解决方案很简单——不要生成那么多代理类型(通常你不必这样做)或使用许多 ModuleScopes/ProxyGenerators(例如 Rhino.Mocks 使用这种方法)
就我个人而言,我不是在 Mono 上开发的,所以我没有第一手经验,但是有一些库在 Mono 上使用 Castle DP,我们没有得到任何兼容,所以我想它工作得很好。
自从我几个月前的基准测试以来,Castle DP 一直没有新版本发布(新版本的目标是年底)。LiFu 有一个 2.0 版本,但我不确定它是否只有主干,或已发布。我不知道 Spring 或 Unity。
Linfu是一个比 Castle 代理生成器更轻量级的代理生成器。
在决定使用哪个时,老实说,它并没有太大的区别。
根据作者的说法,Linfu 将大大优于 Castle 生成器,但在我自己对实际使用情况的观察中,速度上的差异是微不足道的。
话虽如此,Linfu 会胜过 Castle,我不知道 Castle 对它有什么影响,所以我总是使用 Linfu。
我们在 2.0.1 中遇到了一些与 LinFu vs Castle 有关的性能问题。 http://niemware.blogspot.com/2009/11/nhibernate-21-performance-issues-with.html