一旦对内容进行了分析,就会将结果保留到mvc mini profiler数据库中

时间:2012-10-23 22:07:50

标签: c# mvc-mini-profiler

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

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

我必须实现一个调用迷你探查器的Step方法的Step方法(并做一些其他更多的东西)。这样做是因为我们没有直接向我们的开发人员公开mini Profiler的功能。我们将为他们提供不同的方法,例如您可以使用“迷你探查器方法”,也可以使用“秒表方法”。所以,这是我的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源代码进行更改。

有没有简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分: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); 
    }