Интерфейсные методы перехвата в Ninject Interception Extension - PullRequest
4 голосов
/ 10 февраля 2011

Я играю с расширением 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 к динамическим классам-оберткам, который позволяет мне выполнять определенные действия по перехвату всех методов интерфейса, а затем передавать вызов в реальную реализацию?

1 Ответ

5 голосов
/ 10 февраля 2011

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

...