Проблемы с динамическим прокси Ninject Interception - PullRequest
4 голосов
/ 13 января 2012

Я пытаюсь настроить перехват для работы с Ninject, который некоторое время мы использовали в качестве нашей структуры внедрения зависимостей.

Я скачал расширение перехвата из NuGet и попробовал его как с реализацией Castle Dynamicproxy, так и с реализацией LinFu, но не смог также работать с нашими приложениями.

Касл выдал ошибку при создании прокси в классе, у которого не было конструктора без параметров, поскольку все сервисные объекты имеют свои зависимости, введенные через конструктор, это проблема. Ошибка:

System.ArgumentException: не удалось создать экземпляр прокси-сервера класса: emedia.RapidSystems.Subscriber.Presenters.RRSubmissionPresenter. Не удалось найти конструктор без параметров. Имя параметра: constructorArguments

Перехватчик LinFu работал лучше, вплоть до тех пор, пока код не вызвал метод с универсальным параметром, а затем дал мне следующее:

System.ArgumentException: универсальные типы недопустимы. Имя параметра: methodInfo

Вот упрощенный код версии для одного из классов, которые я пытаюсь перехватить:

[LogCalls]
public class Repository<T> : IRepository<T>
        where T : class
{   
    public virtual T GetEntity<TKey>(ObjectContext context, TKey key)
    {
        var entity = GetEntity(context, key, _emptyLoadingStrategy);
        return entity;
    }

    public virtual IQueryable<T> GetAll(ObjectContext context)
    {
        var query = GetAll(context, _emptyLoadingStrategy);
        return query;
    }

    public virtual T Add(ObjectContext context, T entity)
    {
        context.AddObject(EntitySetName(context), entity);
        return entity;
    }

     //other code goes here

}

Add и GetAll работают нормально, но ошибка возникает при вызове GetEntity на прокси.

На данный момент я застрял, так как ни один перехватчик не работает с базой кода. Кто-нибудь получил перехват Ninject, работающий с реальной сложной производственной системой, а не с простым демонстрационным классом, и если да, то как? Я не против, какой перехватчик я использую, пока он работает.

Или перехват с Ninject просто еще недостаточно зрел, и мне нужно взглянуть на замену всего этого чем-то другим, например Unity?

1 Ответ

2 голосов
/ 14 января 2012

Использовать версию 3.0.0-rc2.добавлена ​​поддержка прокси интерфейса для динамического прокси

...