4

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

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

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

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

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

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 

} 

Сложение и GETALL работать нормально, но ошибка происходит, когда GetEntity вызывается на прокси-сервер.

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

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

ответ

3

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

+2

Я попробовал загрузить из NuGet, что он не запускается вообще, и дает ошибку «Метод не найден:» System.Delegate System.Reflection.MethodInfo.CreateDelegate (System.Type).» В любом случае я не могу использовать предварительную версию в производственной среде, поэтому я думаю, что ответ пока еще недостаточно зрелый, и я должен дождаться, пока действительно выпущена версия 3. – Mant101