Ninject Interceptors - PullRequest
       32

Ninject Interceptors

2 голосов
/ 21 февраля 2012

Я разрабатываю настольное приложение WPF с каркасом caliburn.micro и хочу настроить вспомогательные перехватчики, чтобы я мог перехватывать вызовы методов.Я хотел бы сделать это для обработки исключений в централизованном месте, чтобы у меня не было много блоков try-catch повсюду вокруг моего кода.

Я не смог этого сделать, потому что каждый раз, когда ясоединяя все с помощью ninject, система выдает исключение.

Итак, вот некоторый код:

Метод конфигурации AppBootstrapper выглядит следующим образом:

    protected override void Configure()
    {
        _kernel = new StandardKernel(new NinjectServiceModule());
        _kernel.Bind<IWindowManager>().To<WindowManager>().InSingletonScope();
        _kernel.Bind<IEventAggregator>().To<EventAggregator>().InSingletonScope();
        _kernel.Bind<ISomeViewModel>().To<SomeViewModel>().Intercept().With<SomeInterceptor>() //this is where the exception is thrown;
        _kernel.Bind<IShell>().To<ShellViewModel>();
    }

Теперь метод перехватав моем перехватчике:

    public void Intercept(IInvocation invocation)
    {
        if (invocation.Request.Method.Name == "TheMethodIWantIntercepted")
        {
            try
            {
                invocation.Proceed();
            }
            catch (Exception)
            {

                Console.WriteLine("I Handled exception");
            }
        }
        else
        {
            invocation.Proceed();
        }

    }

Метод в модели представления выглядит следующим образом:

    public virtual void TheMethodIWantIntercepted()
    {
        //Some logic here
    }

Так вот, как должны работать перехватчики.Но это не работает, каждый раз, когда я запускаю программу, и ninject пытается вставить экземпляр SomeViewModel в ISomeViewModel, сбой выполнения программы, и это исключение, которое выдается (и трассировка стека): http://pastebin.com/qerZAjVr

Надеюсь, вы поможете мне с этим, заранее спасибо.

1 Ответ

1 голос
/ 22 февраля 2012

Вам необходимо загрузить либо модуль DynamicProxy (2), либо LinFuModule в зависимости от того, какую библиотеку прокси вы предпочитаете.

Также следует помнить, что Ninject 2.2 создаст прокси класса для SomeViewModel, для которого требуется:

  1. конструктор без параметров
  2. виртуальные методы

Интерфейсные прокси не имеют этого ограничения, но для этого требуется Ninject 3.0.0

...