0

Castle Dynamic Proxyを使用して、すでに生成された空ではないオブジェクトにプロキシ機能を追加することは可能ですか?

私はこれを試しました:

Dog _myDog=new Dog();
_myDog.Name="Fuffy";

var _proxyDog = generator.CreateClassProxyWithTarget<Dog>(_myDog, ProxyGenerationOptions.Default, new DogInterceptor());

_proxyDog結果は新しいオブジェクトになります。

これは単なる例です。実際のアプリケーションでは、オブジェクトに30以上のプロパティがあり、それらの小道具を1つずつコピーすることを回避できるかどうかを知りたいです。

4

3 に答える 3

2

はい、そうです。唯一の問題:ProxyGeneratorはとにかくそのタイプのオブジェクトをインスタンス化する必要があります。このコードは私のプロジェクトで実際に正しく機能しています:

public static class MongoExtensions
{
    static readonly ProxyGenerator pg = new ProxyGenerator();
    public static MongoCollection GetRetryCollection(this MongoDatabase db, string collectionName, int retryCount = 5, int pauseBetweenRetries = 2000)
    {
        var coll = db.GetCollection(collectionName);
        return (MongoCollection)pg.CreateClassProxyWithTarget(typeof(MongoCollection), coll, new object[] { db, collectionName, coll.Settings }, new RetryingInterceptor { RetryCount = retryCount, PauseBetweenCalls = pauseBetweenRetries });
    }
}

CreateClassProxyWithTargetのパラメータは次のとおりです。

  • プロキシされるオブジェクトのタイプ、
  • プロキシされたインスタンス
  • プロキシ型のコンストラクターパラメーターの配列。
  • このプロキシのインターセプター。

オブジェクトのコンストラクターパラメーターが必要な理由を実際に説明することはできませんが、このコードは正しく機能します。

于 2013-01-21T12:52:34.427 に答える
1

私は同じ問題を抱えていたので、vladの提案を使用してこれは私のために働きました:

var _proxyDog = generator.CreateClassProxyWithTarget(_myDog.GetType(), _myDog, new DogInterceptor());

私が見ることができるものから、実際のクラスをシミュレートする新しいラッパー(プロキシ)が作成され、ラップされたクラス(ターゲット)が私の元のオブジェクトです。

追加:いいえ、もう一度確認しました。「ターゲットタイプ」は正しいですが、プロキシに設定された値が反映されていません。これはバグだと思います。そして大きなもの。

最初の画像から、すべてのインポートが満たされている元のクラスを確認できます。

ここの画像...残念ながら、「10」の評判が必要なように見えるので、あなたが見るための画像を投稿することはできません。どうやら。それはどれほどばかげていますか?ごめん。

ご覧のとおり、プロキシのプロパティはnullで不完全ですが、「_target」の下の元のクラスはそのままです。プロキシのプロパティをプローブすると異常な動作が発生するため、デコレータの目的を回避するため、ターゲットを検査する必要はありません。

ここに別の画像...

基礎となるクラスを完全に模倣するすべてのプロパティが存在することを期待します。またはそれらのどれも動的ではないマッピング。現状では、私も実際にアクセスしたい1つのプロパティが誤った値で公開されているため、機能していません。

コリン。

于 2013-08-02T16:07:58.590 に答える
0

元の質問のアプローチは問題ありません。ただし、ラップされるクラスのすべてのプロパティが仮想としてマークされていることを確認する必要があります。

于 2013-10-03T14:50:04.557 に答える