1

(静的またはインスタンスの)メソッド呼び出しを動的プロキシによって傍受できる方法を考え出そうとしています。C#拡張メソッドとして実装したいのですが、静的メソッドの動的プロキシを生成する方法にこだわっています。

いくつかの使用法:

Repository.GetAll<T>().CacheForMinutes(10);
Repository.GetAll<T>().LogWhenErrorOccurs();

//or     
var repo = new Repository();
repo.GetAll<T>().CacheForMinutes(10);
repo.GetAll<T>().LogWhenErrorOccurs();

私は任意のライブラリ (linfu、castle.dynamic プロキシ 2 など) を使用できます。

ありがとう!

4

2 に答える 2

9

完全に不可能です。

実際、すべてのインスタンスメソッドでプロキシを生成することさえできません。プロキシ ジェネレータが派生クラスを作成してオーバーライドできるように、それらは仮想でなければなりません。

静的メソッドは決して仮想ではないため、プロキシによってオーバーライドすることはできません。

(技術的には、からクラスを派生させるという非仮想メソッドの回避策がありますが、MarshalByRefObjectこれに対するリモート ベースのソリューションは遅くて扱いにくく、静的メソッドをサポートしません。)

クラスの名前がRepositoryであることを考えると、代わりにこれらのメソッドをインスタンス メソッドにすることをお勧めします。この種の操作は、通常、最初から行うべきではありませんstatic。それらをstaticにすると、多くのものを失います: 疎結合、モッキング、依存性注入、ある程度の単体テスト容易性、そして - 今発見したように - プロキシとインターセプト。

于 2010-04-23T02:29:06.723 に答える
0

一般的な傍受戦略では不可能です。

しかし、コンパイル時に動作する AOP フレームワークのほとんどはそれを行うことができます。(例:PostSharp)

私はオープンソースのNConcern AOP Frameworkに取り組んでいます。

これは単純な .NET AOP フレームワークであり、メソッドを交換することによって実行時にインターセプトを可能にします。

ファクトリ パターンや継承の必要なしに、仮想メソッド、非仮想メソッド、および静的メソッドに対してジョブを実行できます。

私の推奨事項は、AOP を「モンキー パッチ」に使用しないようにすることです。静的メソッドは、主流ではなく、「シングルトン使用のショートカット」のみにする必要があります。

あなたの場合、簡単なプロキシパターンを有効にするために、ショートカップやDI(依存性注入)などの静的メソッドでシングルトンパターンを使用する方が簡単です。

例 :

インターフェース

public interface IRepository
{
    IQueryable<T> Query<T>()
        where T : class;
}

DIを使用した砂糖(工場経由)

static public class Repository
{
    //You can wrap the interface (proxy) here if you need...
    static private readonly IRepository m_Repository = MyDIFactory.Import<IRepository>();

    static public IQueryable<T> Query<T>()
        where T : class
    {
        return Repository.m_Repository.Query<T>();
    }
}

使用法

Repository.Query<T>().CacheForMinutes(10);
Repository.Query<T>().LogWhenErrorOccurs();
于 2016-12-11T11:56:10.983 に答える