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

时间:2009-09-10 17:55:13

标签: .net castle-dynamicproxy linfu-dynamicproxy

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

- 编辑 -


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

3 个答案:

答案 0 :(得分:20)

我是Castle的提交者,为动态代理做贡献,所以我可能有偏见,但我一般认为Castle的动态代理是更好的解决方案。我在这里谈论LinFu DynamicProxy v1.0,因为这是我熟悉的。 LinFu.Proxy 2基于Mono.Cecil并从头开始重写。

  • Castle涵盖了更广泛的场景。
  • Castle拥有(很多)更大的用户群,并在许多OSS和商业应用程序中得到验证
  • 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问题,而是微软实施BCL的bug(在Mono上没有BTW这样的问题)。 只有在单个ModuleScope中有许多(超过200种)代理类型时,这才会体现出来。

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

就我个人而言,我没有在Mono上开发,所以我没有第一手经验,但是在Mono上有使用Castle DP的库,我们没有得到任何合规,所以我想它的工作正常。

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

答案 1 :(得分:10)

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

在决定使用哪个时,说实话它没有多大区别。

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

说过林府的表现会超过城堡,我不知道城堡有什么东西,所以我总是使用林府。

答案 2 :(得分:4)

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