Выборочный перехват методов с использованием autofac и dynamicproxy2 - PullRequest
2 голосов
/ 18 апреля 2010

Я сейчас немного экспериментирую с использованием Autofac-1.4.5.676, autofac contrib и Castle 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.

Ответы [ 2 ]

1 голос
/ 19 апреля 2010

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

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

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

0 голосов
/ 22 июля 2016

Для 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));
...