我正在考虑为我正在开发的一个库添加逻辑,这需要使用动态代理。我希望能从已在生产环境中使用过这两个库的用户那里获得一些建议。其中一个是否表现更出色,是否存在任何缺陷使您不得不切换到另一个等。基本上就是告诉我你们使用这两个库的经验。答案将帮助我决定使用哪一个。
--编辑--
我忘了提到我正在开发的库将支持Mono,因此,如果您能分享有关这两个库及其对Mono的支持的任何知识也将是很棒的。
我正在考虑为我正在开发的一个库添加逻辑,这需要使用动态代理。我希望能从已在生产环境中使用过这两个库的用户那里获得一些建议。其中一个是否表现更出色,是否存在任何缺陷使您不得不切换到另一个等。基本上就是告诉我你们使用这两个库的经验。答案将帮助我决定使用哪一个。
--编辑--
我忘了提到我正在开发的库将支持Mono,因此,如果您能分享有关这两个库及其对Mono的支持的任何知识也将是很棒的。
invocation.Proceed();
对于LinFu而言,它的样子是这样的(实际的方法/属性名称可能因为我是从记忆中写出来的而有所不同)
//invocation.TargetMethod is MethodInfo, so you're using reflection
invocation.TargetMethod.Invoke(invocation.Target,invocation.Parameters);
其他答案提到的性能问题不是DynamicProxy的问题,而是Microsoft对BCL的实现中存在的错误(在Mono上没有此类问题)。 只有当单个ModuleScope中有许多(超过200个以上)代理类型时,才会出现这种情况。
解决方案很简单-不要生成那么多代理类型(通常不需要)或使用多个ModuleScopes / ProxyGenerators(例如Rhino.Mocks使用此方法)
个人而言,我不在Mono上开发,所以我没有第一手经验,但是有使用Castle DP在Mono上的库,我们没有收到任何投诉,所以我想它运行得很好。
自几个月前进行基准测试以来,Castle DP没有新版本发布(新版本定于年底推出)。 LiFu有2.0版本,但我不确定它是否仅为主干,还是已发布。我不知道Spring或Unity。
Linfu是一个比Castle代理生成器更轻量级的代理生成器。
在决定使用哪个时,说实话它们之间并没有太大差异。
据作者介绍,Linfu将明显优于Castle生成器,但在我对实际使用情况的观察中,它们的速度差距微不足道。
话虽如此,Linfu将胜过Castle,而我也不知道Castle有什么优点,所以我总是使用Linfu。
我们在2.0.1版本中遇到了与LinFu和Castle相关的性能问题。详情请参考:http://niemware.blogspot.com/2009/11/nhibernate-21-performance-issues-with.html