2

我知道我可以调用 MiniProfiler.Settings.Storage.Save(MiniProfiler); 将响应时间持久化到数据库。但我在这里有一个更棘手的问题。我们围绕 mvc mini profiler 构建了一个小框架,这样我们也可以在没有 Web 上下文的情况下使用它,它还具有回归报告功能。

但长话短说,这就是问题所在 -

我必须实现一个 Step 方法来调用 mini profiler 的 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 回答