Расширение Ninject Interception создает 2 экземпляра класса; есть ли способ избежать этого - PullRequest
0 голосов
/ 13 июля 2011

У меня проблема с использованием расширения перехвата Ninject с DynamicProxy2.По сути, создаются два экземпляра моего объекта привязки.Моя привязка:

this.Bind<TestInterface1>().ToSelf().Intercept().With(new ActionInterceptor(i => Console.WriteLine("In interceptor")));

Первый экземпляр создается как часть обычной процедуры разрешения.Второй экземпляр создается как часть создания прокси, в частности в DynamicProxy3ProxyFactory.cs .

reference.Instance = this.generator.CreateClassProxy(targetType, ProxyOptions, parameters, wrapper);

Второй экземпляр, кажется, заменяет первый в контексте Ninject (хотя яне уверен на 100% в этом), так что можно поверить, что все в порядке.Первый экземпляр будет только на наносекунду.К сожалению, мои конструкторы не настолько «чисты», и запуск его дважды вызывает некоторую путаницу.Поскольку строительство второго экземпляра ведется в Касле, я не знаю, есть ли способ обойти это, но любой совет будет признателен (переписать конструкторы, которые были продуманы и сбиты :)).

1 Ответ

0 голосов
/ 17 июля 2011

Кажется, вы не понимаете, как работает перехват с использованием динамических прокси. Динамический прокси - это новый класс, который наследуется от перехваченного класса / интерфейса и перенаправляет все вызовы перехваченному классу / интерфейсу.

, например

class A{ }
class AProxy : A {}

Теперь создается экземпляр обоих классов. Поскольку AProxy вызывает базовый конструктор, вы видите два вызова конструктора. Также вы предполагаете, что один экземпляр немедленно собран, и это неправильно. Они имеют одинаковое время жизни.

Самое чистое решение - решить проблему, состоящую в том, что ваш конструктор не может быть вызван дважды. Это сильный признак того, что что-то ужасно неправильно. Другие возможности - использовать 2.3 бета-версию и использовать интерфейс вместо класса или поместить код проблемы в метод инициализации, который вызывается только реальным классом, но не прокси.

...