如何运行代理POCO?

时间:2009-07-06 15:22:57

标签: .net proxy poco

我希望能够使用JREcglib代理库以与Java相同的样式为POCO创建运行时代理。

我看过Castle DynamicProxy看起来很合适,但文档并不好。我也很惊讶这种事情不在.Net框架本身。

有没有人:

  • 知道Castle DynamicProxy有什么好的资源吗?
  • 知道任何其他方法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

这可能不值得回答,但是你没有看到.NET中动态代理数量激增的原因之一是大多数常见的.NET语言(C#,VB.NET)与Java不同一个非常重要的方面:

在Java中,除非明确声明密封,否则所有方法都是虚拟的。

在C#(和VB.NET IIRC)中,除非明确声明为虚拟,否则所有方法和属性都将被密封。

这意味着.NET中动态代理的潜在价值远低于Java。您必须明确地将.NET对象设计为“可代理”,并且大多数人不这样做 - 需要有意识地决定使.NET对象“可代理”。

在DI容器之外看到.NET动态代理实际上是如此罕见,我想不出除Castle之外的任何其他动态代理。

请注意,“默认密封”行为是.NET 语言的一项功能 - 可以设想一个基于.NET的语言,默认情况下具有相同的“虚拟” '作为Java的行为。虽然我不知道,但如果这种语言不存在,我会感到惊讶。毕竟,它都在编译器中。

答案 1 :(得分:1)

“我也很惊讶这种事情不在.Net框架本身。”

有。虽然不完整,优雅或高效。 您可以使用创建从RealProxy继承的通用代理,并可能接受要代理的对象。要获取代理,您可以从realproxy获取transparentproxy并将其转换为您的wrapee(是一个单词?)类型。现在你有一个代理。可以在RealProxy中重写的Invoke(IMessage msg)中处理代理上的所有方法。将它们原样传递给你的真实物体(wrapee)或做其他事情。

Cavets:您要代理的对象必须从MarshalByRef继承。这很慢。我不会将它用于经常使用的功能。这是所有远程基础设施。在大多数情况下,ILgen是更好的方法,但在某些情况下我不得不使用上述方法。