在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问题或类似的东西,我不会感到惊讶,但我想知道是否有人见过这样的东西?
答案 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));
......你应该有更多的运气。