C#で動的プロキシを実装する最良の方法は何ですか?
-
15-10-2019 - |
質問
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 Dynamic Proxiesを使用してこれを実装しようとしました。残念ながら、私はまだ立ち往生しています。プロキシのポイントは、(通常、通常)予想される他のインターフェイスを模倣することです。 DynamicObjectを使用するには、これのすべてのクライアントを変更して、「ISeCondaryInterface」ではなく「ダイナミック」を使用する必要があります。
プロキシオブジェクトを取得する方法はあります。これにより、Aをラップすると、Aのインターフェイスをサポートすることを(静的に)宣伝します。そして、それがBをラップするとき、それはBのインターフェイスをサポートする宣伝をしますか?
更新2
例えば:
class MySecretProxy : DynamicObject, ISecondaryInterface
{
public override void TryInvokeMember(...) { .. }
// no declaration of Bar -- let it be handled by TryInvokeMember
}
解決
.NET 4 DynamicObject
あなたがそれを達成するのを助けることができます。
以前の.NETフレームワークは使用できます。
- 側面#
- encase aop
- spring.net
- aspect.net
- aspectdng
- 動的プロキシ
- 構成*
- loom.net
- postsharp
これらのフレームワークのそれぞれは、メソッドの実行前後の両方でコードを注入するための数字の手法を使用します。これらは通常、4つのカテゴリに分類されます。
- MSILインジェクション - ここでは、実行中のメソッドの本文にMSILコードを注入します。 (シャープを投稿)
- ランタイムダイナミックインジェクション - 反射などの手法を使用して、方法を動的に呼び出します。
- タイプビルダーインジェクション - ランタイムインジェクションに関連して、プロキシを希望するタイプに基づいてタイプを作成し、このタイプを介してリクエストをマーシャルします。 (動的プロキシ)
- コンテナインジェクション - リクエストは、メソッドが実行される前後にコードを呼び出すコンテナを通過します。
を参照してください 完全な記事.
そんなこと知ってる キャッスルプロジェクト's 動的プロキシ よく使用されます(inのように Moq 1つの大きなプロジェクトに名前を付けるだけです)。
更新されたトピックに返信します
あなたが書いたものはコンパイルされません。 動的 プロキシはランタイム生成コードであるため、何らかの形でプロキシを展開しているクラスの具体的なインスタンスを作成する必要があります。あなたがやりたいと思っているかもしれません aop (アスペクト指向プログラミング)。
class MySecretProxy<T> : DynamicObject, T where T : new()
{
private T _instance = new T();
public override void TryInvokeMember(...) { ... }
}
MySecretProxy<Bar> bar;
他のヒント
Castle ProjectのDynamicProxyを見ましたか?それはあなたが最終的に達成しようとしているものを提供するかもしれません。見る http://www.castleproject.org/dynamicproxy/index.html
また、オープンソースであるため、必要に応じてフォークできます。
ターゲットタイプがインターフェイスであるか、MarshalbyRefobjectから派生している場合、RealProxyでこれを行うことができます。
あなたは見たいかもしれません リンフ 動的プロキシメカニズムが含まれています。
私は怠zyなロードにnhibernateが使用したプロキシを知っています
城
リンフ
スプリングバイトコード