3

我希望能够为 POCO 创建一个运行时代理,其风格与我在 Java 中使用JREcglib代理库的风格相同。

我见过Castle DynamicProxy看起来很符合要求,但文档不是很好。我也很惊讶这种东西不在 .Net Framework 本身中。

有没有人:

  • 知道 Castle DynamicProxy 的任何好的资源吗?
  • 知道任何替代方法吗?

谢谢!

4

2 回答 2

2

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

在 Java 中,所有方法都是虚拟的,除非显式声明为密封的。

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

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

实际上,在 DI 容器之外看到 .NET 动态代理非常罕见,以至于我想不出除了 Castle 之外的任何其他动态代理。

请注意,“默认密封”行为是 .NET语言的一个特性- 可以设计一种基于 .NET 的语言,该语言具有与 Java 相同的“默认虚拟”行为。虽然我什么都不知道,但如果不存在这样的语言,我会感到惊讶。毕竟,这一切都在编译器中。

于 2009-07-06T18:01:49.543 回答
1

“我也很惊讶这种东西不在 .Net Framework 本身中。”

有。虽然不完整,但优雅或高性能。您可以使用创建一个从 RealProxy 继承的通用代理,并可能接收要代理的对象。要获得代理,您从您的 realproxy 获得一个透明代理,并将其转换为您的 wrapee(这是一个词吗?)类型。现在你有一个代理。代理上的所有方法都可以在您的 RealProxy 中被覆盖的 Invoke(IMessage msg) 中处理。将它们按原样传递给您的真实对象(wrapee)或在其间做任何其他事情。

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

于 2010-08-04T18:15:15.227 回答