使用PerfIt与Autofac.Extras.DynamicProxy(即Castle.Core)无法正常工作

时间:2016-10-15 20:28:56

标签: autofac interceptor performancecounter

在Windows 7上使用C#.NET。

我想在我的服务工作者中设置一些方法来记录一些性能计数器。我发现这样做的最好方法,IMO,就是PerfIt。

我也使用Autofac作为我的DI容器。这个决定是在我的应用程序服务中的PerfIt之前做出的。这是背景,暂不讨论此刻。

PerfIt在其核心使用Castle.Core IInterceptor,我想使用Autofac.Extras.DynamicProxy。或者,如果有更好的仪器选择,和/或自己动手,我愿意接受它。

我用Autofac注册我的拦截器:

ContainerBuilder builder = // ...

builder.RegisterType<WorkerInterceptor>()
    .OnActivated(args =>
    {
        var instance = args.Instance;
        instance.PublishCounters = true;
        instance.PublishEvent = true;
        instance.RaisePublishErrors = true;
        instance.SamplingRate = 1d;
    })
    .SingleInstance();

我还注册了为其配备关键方法的工作人员。

builder.RegisterType<PuzzleProblemSolverWorker>()
    .As<IServiceWorker>()
    .As<IPuzzleProblemSolverWorker>()
    .InstancePerDependency()
    .InterceptedBy(typeof(WorkerInterceptor));

仪器化方法是:

[PerfIt("PuzzleService", InstanceName = "PuzzleProblemSolverWorker")]
public virtual bool ShouldSaveSolution(byte[] bytes)
{
    // ... Calculated whether shouldSave ...
    return shouldSave;
}

实际上调用了检测方法,由断点验证。但是,我没有看到任何证据证明仪器工作正常。

我的困惑在于,PerfIt和/或Autofac.Extras.DynamicProxy之间存在足够的融合,不确定哪个未能看到另一个和/或工人,但是某些东西显然已经崩溃了。 / p>

单独地,两个测试都在各自的项目中进行。但似乎没有通过我的Autofac容器看到彼此。如果它是一个Reflection BindingFlags问题或类似的东西,我不会感到惊讶,但我想知道是否有人见过这样的东西?

1 个答案:

答案 0 :(得分:0)

您似乎错过了EnableClassInterceptors注册时的PuzzleProblemSolverWorker来电。

示例from the docs显示了这一点:

builder.RegisterType<SomeType>()
   .EnableClassInterceptors()
   .InterceptedBy(typeof(CallLogger));

所以如果你更新到这个......

builder.RegisterType<PuzzleProblemSolverWorker>()
  .As<IServiceWorker>()
  .As<IPuzzleProblemSolverWorker>()
  .InstancePerDependency()
  .EnableClassInterceptors()
  .InterceptedBy(typeof(WorkerInterceptor));

......你应该有更多的运气。