3

Java でJREまたはcglibプロキシ ライブラリを使用するのと同じスタイルで、POCO のランタイム プロキシを作成できるようにしたいと考えています。

法案に適合しているように見えるCastle DynamicProxyを見てきましたが、ドキュメントは良くありません。この種のことが .Net Framework 自体にないことにも驚きました。

誰か:

  • Castle DynamicProxy の良いリソースを知っていますか?
  • 代替アプローチを知っていますか?

ありがとう!

4

2 に答える 2

2

これは答えが出るほど価値がないかもしれませんが、.NET で動的プロキシが普及していない理由の 1 つは、最も一般的な .NET 言語 (C#、VB.NET) が Java と非常に重要な 1 つの点で異なるためです。側面:

Java では、sealed を明示的に宣言しない限り、すべてのメソッドは仮想です。

C# (および VB.NET IIRC) では、明示的に仮想宣言されていない限り、すべてのメソッドとプロパティがシールされます。

これは、ダイナミック プロキシの潜在的な価値が Java よりも .NET ではるかに低いことを意味します。.NET オブジェクトを明示的に「プロキシ可能」に設計する必要がありますが、ほとんどの人はそうしません。.NET オブジェクトを「プロキシ可能」にするには、意識的な決定が必要です。

実際、DI コンテナーの外部で .NET 動的プロキシーを目にすることは非常にまれであるため、Castle 以外の動的プロキシーは考えられません。

「デフォルトで封印」動作は .NET言語の機能であることに注意してください。Java と同じ「デフォルトで仮想」動作を持つ .NET ベースの言語を設計できる可能性は十分に考えられます。私は何も知りませんが、そのような言語が存在しないとしたら驚きです。結局のところ、それはすべてコンパイラにあります。

于 2009-07-06T18:01:49.543 に答える
1

「この種のことが .Net Framework 自体にないことにも驚いています。」

がある。完全ではありませんが、エレガントまたは高性能です。RealProxy から継承し、おそらくプロキシされるオブジェクトを取り込む汎用プロキシを作成できます。プロキシを取得するには、realproxy から transparentproxy を取得し、それを wrapee の (それは単語ですか?) タイプにキャストします。これでプロキシができました。プロキシのすべてのメソッドは、RealProxy でオーバーライドされた Invoke(IMessage msg) で処理できます。それらをそのまま実際のオブジェクト(wrapee)に渡すか、その間に何かをします。

警告: プロキシされるオブジェクトは、MarshalByRef から継承する必要があります。かなり遅いです。頻繁に使用する機能には使用しません。これが、ここでのすべてのリモート インフラストラクチャです。ほとんどの場合、ILgen の方が適していますが、上記の方法を使用しなければならない場合もあります。

于 2010-08-04T18:15:15.227 に答える