Методы выборочного перехвата с использованием autofac и dynamicproxy2

В настоящее время я немного экспериментирую, используя Autofac-1.4.5.676, autofac contrib и замок DynamicProxy2. Цель состоит в том, чтобы создать грубый профилировщик, который может перехватывать вызовы конкретных методов определенного интерфейса.

Проблема: у меня все работает отлично, кроме выборочной части. Я могу ошибаться, но я думаю, что мне нужно женить свой перехватчик с реализацией IProxyGenerationHook, но я не могу понять, как это сделать.

Мой код выглядит примерно так:

Интерфейс, который нужно перехватить и профилировать (обратите внимание, что меня интересует только профилирование метода Update())

public interface ISomeSystemToMonitor
{
    void Update(); // this is the one I want to profile
    void SomeOtherMethodWeDontCareAboutProfiling();
}

Теперь, когда я регистрирую свои системы в контейнере, я делаю следующее:

// Register interceptor gubbins
builder.RegisterModule(new FlexibleInterceptionModule());
builder.Register<PerformanceInterceptor>();

// Register systems (just one in this example)
builder.Register<AudioSystem>()
.As<ISomeSystemToMonitor>)
.InterceptedBy(typeof(PerformanceInterceptor)); 

Все экземпляры ISomeSystemToMonitor, извлеченные из контейнера, перехватываются и профилируются по желанию, за исключением того факта, что он будет перехватывать все свои методы, а не только метод Update.

Теперь, как я могу расширить это, чтобы исключить все методы, кроме Update()? Как я уже сказал, я не понимаю, как я должен сообщить контейнеру, что «для ProfileInterceptor используйте эту реализацию IProxyHookGenerator».

Вся помощь приветствуется, ура! Также обратите внимание, что сейчас я не могу перейти на autofac2.x; Я застрял на 1.


person Mark Simpson    schedule 18.04.2010    source источник


Ответы (2)


Экземпляр IProxyGenerationHook должен быть передан вызову CreateInterfaceProxyWithTarget при создании перехватчика. См. это руководство для более подробной информации.

В настоящее время, похоже, нет способа предоставить такие хуки без изменений в модуле интеграции Autofac.DynamicProxy2. Может быть хорошим дополнением к расширению InterceptedBy.

В качестве альтернативы вы можете встроить фильтрацию в PerformanceInterceptor. Глядя на IInvocation, которое вы передали при вызове, изучите свойство Method, чтобы решить, нужно ли профилировать или нет. Но это конечно будет менее эффективно, чем обход перехвата на уровне прокси.

person Peter Lillevold    schedule 19.04.2010
comment
Спасибо за ответ, Петр. Поскольку это для профилирования кода, я бы хотел, чтобы он был как можно более легким, поэтому, думаю, мне придется проверить производительность выполнения проверки внутри перехватчика, а также проверить его гибкость и т. д. - person Mark Simpson; 19.04.2010
comment
Если вы готовы к этому, вы можете взять источник AutofacContrib.DynamicProxy2 и добавить хук вручную. Таким образом, вы можете, по крайней мере, получить некоторое сравнение, используя ловушку и фильтрацию в перехватчике. - person Peter Lillevold; 19.04.2010
comment
Я знаю, что это старый вопрос, но для тех, кто читает это, с более новой версией DynamicProxy2 теперь можно использовать .EnableClassInterceptors(new ProxyGenerationOptions(hook)) для указания ловушки. - person Cyril Durand; 02.03.2015
comment
Спасибо за наводку, @CyrilDurand - person Peter Lillevold; 02.03.2015

Для DynamicProxy2 метод EnableInterfaceInterceptors теперь имеет перегрузку, которая принимает объект ProxyGenerationOptions.

//Define the builder
var builder = new ContainerBuilder();

//Instantiate your Proxy options with a selector
var proxyOptions = new ProxyGenerationOptions {Selector = new MyInterceptSelector()};

//Pass the proxy options as a parameter to the EnableInterfaceInterceptors method
builder.RegisterType<MyRepo>()
            .As<IMyRepo>()
            .EnableInterfaceInterceptors(proxyOptions)
            .InterceptedBy(typeof(IInterceptor));
person CodeAlchemist    schedule 22.07.2016