2016-10-15 5 views
0

Использование C# .NET на Windows 7.Использование Perfit с Autofac.Extras.DynamicProxy (т.е. Castle.Core) не работает

Я хочу, чтобы инструмент некоторые методы в моих работников сферы обслуживания, чтобы записать несколько счетчиков производительности. Лучший способ, который я нашел для этого, ИМО, - это 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, не уверенным, что не видит другого и/или работника, но что-то явно проваливается сквозь трещины.

Индивидуально оба теста проходят в рамках соответствующих проектов. Но, похоже, вы не видите друг друга через мой контейнер Autofac. Я бы не удивился, если бы это была проблема Reflection BindingFlags или что-то в этом роде, но мне интересно, видел ли кто-нибудь подобное?

ответ

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)); 

... вы должны иметь больше удачи.

+0

Благодарим за понимание. Поскольку я изучал PerfIt с некоторым интересом, были некоторые нюансы, в которых мне нужно было больше внимания, поэтому я позволил себе сделать собственное предложение. Не стесняйтесь смотреть [здесь] (http://github.com/mwpowellhtx/MeasureIt/), если вам интересно. – mwpowellhtx