5

C# で動的プロキシを作成する必要があります。このクラスで別のクラスをラップし、そのパブリック インターフェイスを使用して、これらの関数の呼び出しを転送する必要があります。

class MyRootClass
{
    public virtual void Foo()
    {
        Console.Out.WriteLine("Foo!");
    }

}

interface ISecondaryInterface
{
    void Bar();
}

class Wrapper<T> : ISecondaryInterface where T: MyRootClass
{
    public Wrapper(T otherObj)
    {
    }

    public void Bar()
    {
        Console.Out.WriteLine("Bar!");
    }
}

使用方法は次のとおりです。

Wrapper<MyRootClass> wrappedObj = new Wrapper<MyRootClass>(new MyRootClass());
wrappedObj.Bar();
wrappedObj.Foo();

生産する:

Bar!
Foo!

何か案は?

これを行う最も簡単な方法は何ですか?

これを行う最善の方法は何ですか?

本当にありがとう。

アップデート

Wernight の推奨に従い、C# 4.0 動的プロキシを使用してこれを実装しようとしました。残念ながら、私はまだ立ち往生しています。プロキシのポイントは、(通常、通常) 期待される他のインターフェイスを模倣することです。DynamicObject を使用するには、このすべてのクライアントを変更して、「ISecondaryInterface」ではなく「dynamic」を使用する必要があります。

A をラップするときに、A のインターフェイスをサポートしていることを (静的に?) アドバタイズするように、プロキシ オブジェクトを取得する方法はありますか。Bをラップすると、Bのインターフェースをサポートしていることをアドバタイズしますか?

更新 2

例えば:

class MySecretProxy : DynamicObject, ISecondaryInterface
{
    public override void TryInvokeMember(...) { .. }

    // no declaration of Bar -- let it be handled by TryInvokeMember
 }
4

5 に答える 5

7

.NET 4DynamicObjectは、それを実現するのに役立ちます。

以前の .NET フレームワークでは以下を使用できます。

  • 側面#
  • AOP をケースに入れる
  • Spring.NET
  • アスペクト.NET
  • アスペクトDNG
  • 動的プロキシ
  • 作成*
  • Loom.NET
  • ポストシャープ

これらの各フレームワークは、メソッドの実行前と実行後の両方でコードを挿入するためのさまざまな手法を利用しています。これらは一般的に 4 つのカテゴリに分類されます。

  • MSIL インジェクション– ここでは、実行中のメソッドの本体に MSIL コードを挿入します。(ポストシャープ)
  • ランタイムの動的注入– リフレクションなどの手法を使用して、メソッドを動的に呼び出します。
  • タイプ ビルダー インジェクション– ランタイム インジェクションに関連して、プロキシしたいタイプに基づいてタイプを作成し、このタイプを介してリクエストをマーシャリングします。(動的プロキシ)
  • コンテナ インジェクション– リクエストは、メソッドが実行される前後にコードを呼び出すコンテナを通過します。

記事全文を参照してください。

Castle ProjectDynamic Proxyがよく使用されることは知っています ( Moqのように、 1 つの大きなプロジェクトに名前を付けるだけです)。


更新されたトピックに返信

あなたが書いたものはコンパイルされません。動的プロキシは実行時に生成されるコードであるため、何らかの方法でプロキシするクラスの具体的なインスタンスを作成する必要があります。AOP (アスペクト指向プログラミング)を検討しているのかもしれません。

class MySecretProxy<T> : DynamicObject, T where T : new()
{
    private T _instance = new T();

    public override void TryInvokeMember(...) { ... }
}

MySecretProxy<Bar> bar;
于 2011-06-06T08:43:52.563 に答える
3

CastleプロジェクトのDynamicProxyを見たことがありますか?それはあなたが最終的に達成しようとしていることを提供するかもしれません。http://www.castleproject.org/dynamicproxy/index.htmlを参照してください

また、オープンソースであるため、必要に応じてフォークすることもできます。

于 2011-01-04T19:50:21.400 に答える
1

ターゲット タイプがインターフェイスであるか、または MarshalByRefObject から派生している場合は、RealProxy を使用してこれを行うことができます。

于 2011-07-14T16:29:42.200 に答える
0

nhibernate が遅延読み込みに使用するプロキシを知っています

臨福

春のバイトコード

于 2011-01-04T19:55:26.143 に答える
0

ダイナミック プロキシ メカニズムを含むlinfuを参照することをお勧めします。

于 2011-01-04T19:53:52.087 に答える