Не могу получить Ninject.Extensions.Interception работает - PullRequest
19 голосов
/ 03 апреля 2012

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

Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>();

Ошибка загрузки Ninject компонента IAdviceFactory. Ни один такой компонент не был зарегистрирован в контейнере компонента ядра

Я пробовал с LoadExtensions и без него, с использованием модуля для настройки моих привязок, и моя последняя попытка выглядит так

internal class AppConfiguration 
{

    internal AppConfiguration( )
    {
        var settings = new NinjectSettings() { LoadExtensions = false };
        Kernel = new StandardKernel(settings);
        Load();
    }

    internal StandardKernel Kernel { get; set; }

    public static AppConfiguration Instance
    {
        get { return _instance ?? (_instance = new AppConfiguration()); }
    }

    private static AppConfiguration _instance;

    private void Load()
    {
        Kernel.Bind<ILoggerAspect>().To<Log4NetAspect>().InSingletonScope();
        Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>();
    }

    internal static StandardKernel Resolver()
    {
        return Instance.Kernel;
    }
}

Мой атрибут логгера выглядит так

public class LogAttribute : InterceptAttribute
{
    public override IInterceptor CreateInterceptor(IProxyRequest request)
    {
        return request.Context.Kernel.Get<ILoggerAspect>();
    }
}

А мой перехватчик вот так

 public class Log4NetAspect : SimpleInterceptor, ILoggerAspect
{
    protected override void BeforeInvoke(IInvocation invocation)
    {
        Debug.WriteLine("Running " + invocation.ReturnValue);
        base.BeforeInvoke(invocation);
    }

    public new void Intercept(IInvocation invocation)
    {
        try
        {
            base.Intercept(invocation);
        }
        catch (Exception e)
        {
            Debug.WriteLine("Exception: " + e.Message);
        }
    }

    protected override void AfterInvoke(IInvocation invocation)
    {
        Debug.WriteLine("After Method");
        base.AfterInvoke(invocation);
    }
}

Ответы [ 2 ]

28 голосов
/ 03 апреля 2012

Скорее всего, вы не развернули Ninject.Extensions.Interception.DynamicProxy или Ninject.Extensions.Interception.Linfu вместе со своим приложением [и Ninject.Extensions.Interception].Вы должны выбрать ровно один из них.

С кодом, который у вас есть сейчас (LoadExtensions=false), он не сможет подобрать определенную библиотеку перехвата - вы должны удалить это, и загрузка обычных расширений должнаподключите расширение к ядру при создании, чтобы биты перехвата могли его поднять.

2 голосов
/ 27 июня 2016

В дополнение к ответу Remo Gloor , который указывал мне на добавление пакета nuget для Ninject.Extensions.Interception.DynamicProxy, я продолжал получать то же исключение, что и OP, до тех пор, пока я вручную не загрузил DynamicProxyModule - FuncModule также загружается вручную, чтобы обойти аналогичную ошибку с заводским расширением:

_kernel = new StandardKernel(
    new NinjectSettings{LoadExtensions = true}, 
    new FuncModule(), 
    new DynamicProxyModule()); // <~ this is what fixed it
...