LinFu.DynamicProxy和Castle.DynamicProxy有什么区别?

31

我正在考虑为我正在开发的一个库添加逻辑,这需要使用动态代理。我希望能从已在生产环境中使用过这两个库的用户那里获得一些建议。其中一个是否表现更出色,是否存在任何缺陷使您不得不切换到另一个等。基本上就是告诉我你们使用这两个库的经验。答案将帮助我决定使用哪一个。

--编辑--


我忘了提到我正在开发的库将支持Mono,因此,如果您能分享有关这两个库及其对Mono的支持的任何知识也将是很棒的。

3个回答

20
我是Castle的一名提交者,为Dynamic Proxy做出了贡献,所以我可能有偏见,但我通常认为Castle的Dynamic Proxy是更好的解决方案。我在这里谈论的是LinFu DynamicProxy v1.0,因为这是我熟悉的版本。LinFu.Proxy 2基于Mono.Cecil,并且是从头开始重写的。
  • Castle覆盖范围更广。
  • Castle拥有(很多)更大的用户群体,在许多开源和商业应用程序中得到证明
  • 实际上,Castle的性能更好(link
  • 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的问题,而是Microsoft对BCL的实现中存在的错误(在Mono上没有此类问题)。 只有当单个ModuleScope中有许多(超过200个以上)代理类型时,才会出现这种情况。

解决方案很简单-不要生成那么多代理类型(通常不需要)或使用多个ModuleScopes / ProxyGenerators(例如Rhino.Mocks使用此方法)

个人而言,我不在Mono上开发,所以我没有第一手经验,但是有使用Castle DP在Mono上的库,我们没有收到任何投诉,所以我想它运行得很好。

自几个月前进行基准测试以来,Castle DP没有新版本发布(新版本定于年底推出)。 LiFu有2.0版本,但我不确定它是否仅为主干,还是已发布。我不知道Spring或Unity。


@Krzysztof - 感谢您提供的性能测试链接。我看到这些测试是大约6个月前进行的。您是否尝试使用每个框架的最新版本再次运行测试?我不确定是否有新版本发布。另外,我在我的问题中忘记了一件事并进行了编辑。您能否编辑您的答案,包括在Mono下进行任何测试的经验? - Dale Ragan
我已经对动态代理(trunk)进行了与2.1版本的测试。虽然拦截时间没有改变(而且它非常快),但代理类型生成现在快了多倍。 - Krzysztof Kozmic
@KrzysztofKoźmic,在Castle和Lin Fu之间,您目前的建议是什么? - smartcaveman
2
这显然已经过时了,其中一个 Linfo 中的堆栈跟踪错误似乎已经得到修复。 - Sam Saffron

10

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

在决定使用哪个时,说实话它们之间并没有太大差异。

据作者介绍,Linfu将明显优于Castle生成器,但在我对实际使用情况的观察中,它们的速度差距微不足道。

话虽如此,Linfu将胜过Castle,而我也不知道Castle有什么优点,所以我总是使用Linfu。


2
“轻量级”是什么意思? - Krzysztof Kozmic
1
轻量级的意思是指代码更少、汇编更小,以及(好吧,根据你如何使用它而定)更快。 - Cocowalla
@Cocowalla - 你是否使用基于Mono.Cecil的最新版本?此外,你能分享在Mono中运行LinFu的经验吗? - Dale Ragan
1
抱歉,我正在Windows上使用Linfu DynamicProxy 1.0.3与NHibernate :) 我可能不正确,但我不认为新版本已经支持NHibernate了。在我的使用中,我发现使用Linfu比Castle的性能好约1%。虽然不是很多,但由于我在应用程序中没有其他地方使用Castle,所以我没有理由不使用Linfu(如果我在其他地方使用了Castle,我会坚持使用它来保持依赖关系) - Cocowalla

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接