31

我正在考虑将逻辑添加到我正在处理的库中,这需要动态代理。我想从在生产环境中使用这两个库的用户那里得到一些建议。一个能胜过另一个,是否有任何缺点让你不得不切换到另一个,等等。基本上告诉我你在图书馆的经历。答案将帮助我决定使用哪一个。

- 编辑 -


我忘了提到我正在开发的库将支持 Mono,因此您可以分享关于这两个库的任何知识以及它们对 Mono 的支持也会很棒。

4

3 回答 3

20

我是 Castle 的提交者,为 Dynamic Proxy 做贡献,所以我可能有偏见,但我通常认为 Castle 的 Dynamic proxy 是更好的解决方案。我在这里说的是LinFu DynamicProxy v1.0,因为那是我熟悉的。LinFu.Proxy 2 基于 Mono.Cecil 并从头开始重写。

  • 城堡涵盖了更广泛的场景。
  • Castle 拥有(很多)更大的用户群,并在许多 OSS 和商业应用程序中得到证明
  • Castle 实际上表现更好(链接
  • Castle 具有更简洁、更易于使用的 API,例如调用 Castle DynamicProxy 的目标方法如下所示:

invocation.Proceed();

对于 LinFu,它看起来像这样(实际的方法/属性名称可能会有所不同,因为我是从内存中写出来的)

//invocation.TargetMethod is MethodInfo, so you're using reflection
invocation.TargetMethod.Invoke(invocation.Target,invocation.Parameters);
  • Castle 有一个活跃的用户组,您可以在其中快速获得问题的答案。

另一个答案提到的性能问题不是 DynamicProxy 问题,而是微软 BCL 实现中的错误的结果(顺便说一句,在 Mono 上没有这样的问题)。只有当您在单个 ModuleScope 中有许多(超过 200 多个)代理类型时,才会出现这种情况。

解决方案很简单——不要生成那么多代理类型(通常你不必这样做)或使用许多 ModuleScopes/ProxyGenerators(例如 Rhino.Mocks 使用这种方法)

就我个人而言,我不是在 Mono 上开发的,所以我没有第一手经验,但是有一些库在 Mono 上使用 Castle DP,我们没有得到任何兼容,所以我想它工作得很好。

自从我几个月前的基准测试以来,Castle DP 一直没有新版本发布(新版本的目标是年底)。LiFu 有一个 2.0 版本,但我不确定它是否只有主干,或已发布。我不知道 Spring 或 Unity。

于 2009-09-10T19:22:42.663 回答
10

Linfu是一个比 Castle 代理生成器更轻量级的代理生成器。

在决定使用哪个时,老实说,它并没有太大的区别。

根据作者的说法,Linfu 将大大优于 Castle 生成器,但在我自己对实际使用情况的观察中,速度上的差异是微不足道的。

话虽如此,Linfu 会胜过 Castle,我不知道 Castle 对它有什么影响,所以我总是使用 Linfu。

于 2009-09-10T18:09:32.293 回答
4

我们在 2.0.1 中遇到了一些与 LinFu vs Castle 有关的性能问题。 http://niemware.blogspot.com/2009/11/nhibernate-21-performance-issues-with.html

于 2009-11-17T21:36:36.230 回答