我知道我可以打电话给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源代码进行更改。
有没有简单的方法可以做到这一点?
答案 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);
}