Звучит так, как будто вы обращаетесь к обычному динамическому перехватчику, так работает расширение Ninject Interception по умолчанию.
Вот пример условного перехвата:
class CustomInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
if (invocation.Request.Method.Name == "MethodToIntercept")
Console.WriteLine("Intercepted!");
invocation.Proceed();
}
}
Вы привязываете его непосредственно к одному классу, например так:
public class MyModule : NinjectModule
{
public override void Load()
{
Bind<IFoo>().To<MyFoo>().Intercept().With<CustomInterceptor>();
}
}
И это почти все, что вам нужно сделать, если вы хотите динамически перехватить один класс.
Расширения ядра выглядят многообещающими, потому что они позволяют записывать условия непосредственно в объявление:
kernel.Intercept(ctx => ctx.Request.Service == typeof(IFoo))
.With<CustomInterceptor>();
Однако это не особенно полезно, если вы пытаетесь принимать решения на основе метода выполняется, потому что это дает вам доступ только к контексту привязки, а не к вызову.В основном, это расширение существует, так что вы можете выбрать, какие классы или сервисы (в отличие от методов ) для перехвата во время выполнения.
Лучшепридерживаться синтаксиса привязки и записывать логику запуска или не запуска непосредственно в перехватчик, как показано в первом примере.
Одна важная вещь, на которую следует обратить внимание, это то, что динамический перехватчик будет на самом делезапускать для каждый (публичный / виртуальный) метод для любого класса, к которому он привязан, что может быть очень неэффективно.К сожалению, расширение Ninject Interception должно использовать подход с наименьшим общим знаменателем, поскольку оно разработано для поддержки нескольких прокси-библиотек.Если вы используете Castle напрямую, вы можете использовать перехватчики прокси-генераторов и селекторы-перехватчики для детального управления , что на самом деле является рекомендуемым подходом.Насколько я могу судить из исходного кода Ninject-DP2, это не поддерживается с расширением Ninject.
Лично у меня никогда не было большого успеха с расширением Ninject Interception именно по этой причине,и склонны использовать Castle DP2 напрямую.Однако, если вы делаете это в небольшом масштабе и не пишете приложение, чувствительное к производительности, у вас должно получиться хорошо писать динамические перехватчики.