Перехват с помощью Ninject. Не удалось загрузить IProxyRequestFactory

Я изучаю использование шаблона Ninject и Interceptor.

У меня есть следующий перехватчик.

public class MyInterceptor:IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine("Pre Execute: " + invocation.Request.Method.Name);

        foreach (var param in invocation.Request.Arguments)
        {
            Console.WriteLine("param : " + param);
        }

        invocation.Proceed();

        Console.WriteLine("Post Execute: " + invocation.Request.Method.Name);
        Console.WriteLine("Returned: " + invocation.ReturnValue);
    }
}

И у вас есть класс с именем MyClass, который получил только 2 простых метода, виртуальных, чтобы позволить перехватчикам работать над ними. (Два метода: Echo и double, что делает их имя.)

Я добавил Ninject, Ninject.Extensions.Interception и Ninject.Extensions.Interception.DynamicProxy к моему проекту через NuGet.

Добавлены следующие операторы using.

using Ninject;
using Ninject.Extensions.Interception.Infrastructure.Language;
using Ninject.Extensions.Interception;

Мой главный метод, который делает загрузку, выглядит следующим образом.

static void Main(string[] args)
    {
        MyClass o = null;

        using (IKernel kernel = new StandardKernel())
        {

            kernel.Bind<MyClass>().ToSelf().Intercept().With(new MyInterceptor());
            o = kernel.Get<MyClass>();
        }

        o.Echo("Hello World!"); // Error
        o.Double(5);
    }

Я получаю следующую ошибку в указанной строке.

Error loading Ninject component IProxyRequestFactory
No such component has been registered in the kernel component container.

Suggestions:
  1) If you have created a custom subclass for KernelBase, ensure that you have  properly
     implemented the AddComponents() method.
  2) Ensure that you have not removed the component from the container via a call to RemoveAll().
  3) Ensure you have not accidentally created more than one kernel..

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Ответ 1

ОК, наконец, я смог воспроизвести (забыл сделать виртуальные методы MyClass). То, как я решил это, было удалением блока using из ядра:

    static void Main(string[] args)
    {
        MyClass o = null;

        var kernel = new StandardKernel();
        kernel.Bind<MyClass>().ToSelf().Intercept().With(new MyInterceptor());
        o = kernel.Get<MyClass>();

        o.Echo("Hello World!"); // Error
        o.Double(5);
        Console.ReadKey(true);
    }

Причина, по которой я угадываю, работает, потому что под обложками создается прокси-класс для MyClass и как-то проходит в IKernel прокси. Когда вы вызываете метод (в прокси), он возвращается к ядру и разрешает некоторые дополнительные зависимости (включая IProxyRequestFactory). Поскольку вы распоряжались им, он больше не смог разрешить эту зависимость.