我希望能够使用JRE或cglib代理库以与Java相同的样式为POCO创建运行时代理。
我看过Castle DynamicProxy看起来很合适,但文档并不好。我也很惊讶这种事情不在.Net框架本身。
有没有人:
谢谢!
答案 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是更好的方法,但在某些情况下我不得不使用上述方法。