Методы интерфейса перехвата в расширении перехвата Ninject

Я играю с расширением Ninject Interception. запись в блоге Яна Дэвиса об этом указывает, что перехват всегда основан на фактическом типе службы, а не на интерфейсе. Например, следующий код не будет работать, потому что IFoo — это интерфейс:

Kernel.InterceptBefore<IFoo>(f => f.DoSomething(), 
    i => Console.WriteLine("before"));

И, конечно же, следующий фрагмент кода будет работать только в том случае, если Foo.DoSomething равно virtual:

Kernel.InterceptBefore<Foo>(f => f.DoSomething(), 
    i => Console.WriteLine("before"));

Это кажется довольно вопиющей дырой, когда дело доходит до аспектно-ориентированного программирования. Я довольно добросовестно программировал интерфейсы, чтобы мы могли использовать фиктивные фреймворки для имитации наших различных сервисов, но подавляющее большинство моих фактических реализаций методов не являются виртуальными. Если фиктивный фреймворк может создать IFoo с помощью метода, который делает то, о чем я прошу, кажется, что Ninject должен уметь это делать.

Поэтому я думаю, что мой вопрос двоякий:

  1. Есть ли причина, по которой Ninject Interception не позволяет привязываться к методам интерфейса?
  2. Есть ли простой способ заставить Ninject привязываться к динамическим классам-оболочкам, которые могут позволить мне выполнять определенные действия по перехвату всех методов интерфейса, а затем передавать вызов реальной реализации?

person StriplingWarrior    schedule 09.02.2011    source источник


Ответы (1)


Я немного поработал над этим, и кажется, что такое поведение можно включить в расширение перехвата. Но так как мы планировали выпустить версию 2.2 в самое ближайшее время, вам нужно немного потерпеть. Мне определенно нравится это изменение, поэтому я планировал добавить его в 2.4. Также спайк далеко не продуктивный. Однако все текущие модульные тесты выполняются. Но есть много новых, которые нужно добавить с этой функцией. Если хотите, я могу выслать вам патч, но я не дам вам никакой поддержки и не гарантирую, что на данный момент он свободен от ошибок.

person Remo Gloor    schedule 10.02.2011
comment
Спасибо, Ремо. Я могу быть чрезвычайно терпеливым по этому поводу. Ничего критичного в нашем проекте от этой фичи не зависит. Я ценю всю отличную работу, которую вы проделали с Ninject, а также быстрые и последовательные ответы, которые вы даете сообществу пользователей. Дайте мне знать, если я могу сделать что-нибудь, чтобы поддержать вас в этом. - person StriplingWarrior; 10.02.2011
comment
Это уже реализовано? - person mac10688; 18.02.2015