2

MiniProfiler.Settings.Storage.Save(MiniProfiler); を呼び出すことができることはわかっています。データベースへの応答時間を永続化します。しかし、ここにはもう少しトリッキーな問題があります。Web コンテキストなしでも使用できるように、mvc ミニ プロファイラーの周りに小さなフレームワークを構築しました。また、回帰レポート機能も備えています。

しかし、長い話を短くすると、ここに問題があります -

ミニプロファイラーの Step メソッドを呼び出す Step メソッドを実装する必要がありました (さらに他の処理も行います)。これは、ミニ プロファイラーの機能を開発者にそのまま公開していないためです。「ミニプロファイラーアプローチ」または「ストップウォッチアプローチ」を使用できるように、さまざまなアプローチを提供します。だから、これが私の Step メソッドのコードです -

public IDisposable Step(Profiler profiler, String operationName, Int32 numofInvocations = 1, Action operation = null) //
    {
        if (profiler == Profiler.MVCMiniProfiler)
        {
            return MiniProfiler.Step(operationName);  //This is statement to note in this code
        }
        else if (profiler == Profiler.MyStopWatch)
        {
            return new MyStopWatch(operationName, numofInvocations, operation);
        }
        else
        {
            return null;
        }
    }

ここでの問題は、MiniProfiler の Step メソッドが使い捨てオブジェクト (コード内の Timing オブジェクト) を返し、Timing オブジェクトの Dispose() がストップウォッチを停止して経過時間を返すことです。私がしなければならないことは、プロファイルが作成されたらすぐに Save() メソッドを呼び出すことです。しかし、MiniProfiler のソース コードも変更したくありません。

これを行う簡単な方法はありますか?

4

1 に答える 1

2

インターフェイスも実装するラッパーを作成できIDisposableます。何かのようなもの:

public class MiniProfilerStep : IDisposable
{
    private readonly MiniProfiler _profiler;
    private readonly IDisposable _step;

    public MiniProfilerStep(MiniProfiler profiler, string operation)
    {
        _profiler = profiler;
        _step = _profiler.Step(operation);
    }

    public void Dispose()
    {
        _step.Dispose();
        MiniProfiler.Settings.Storage.Save(_profiler);
    }
}

次に、ミニ プロファイラー ステップの代わりにラッパーのインスタンスを返します。

   if (profiler == Profiler.MVCMiniProfiler)
    {
        return new MiniProfilerStep(MiniProfiler, operationName); 
    }
于 2012-10-23T22:24:48.710 に答える