Могу ли я зарегистрировать компонент Interface в Castle Windsor и получить прокси-сервер для реализации? - PullRequest
5 голосов
/ 02 мая 2010

Рассмотрим некоторые случаи:

_windsor.Register(Component.For<IProductServices>().ImplementedBy<ProductServices>().Interceptors(typeof(SomeInterceptorType));

В этом случае, когда я запрашиваю IProductServices, windsor прокси-интерфейс для перехвата вызовов метода интерфейса. Если вместо этого я делаю это:

_windsor.Register(Component.For<ProductServices>().Interceptors(typeof(SomeInterceptorType));

тогда я не могу попросить windsor разрешить IProductServices, вместо этого я прошу ProductServices и он вернет динамический подкласс, который будет перехватывать вызовы виртуальных методов. Конечно, динамический подкласс все еще реализует IProductServices

У меня вопрос: могу ли я зарегистрировать компонент интерфейса, как в первом случае, и получить прокси подкласса, как во втором случае ?.

Для этого есть две причины:
1 - потому что код, который собирается разрешить, не может знать о классе ProductServices, только об интерфейсе IProductServices. 2 - Поскольку некоторые вызовы событий, которые передают отправителя в качестве параметра, передадут объект ProductServices, и в первом случае этот объект является полем на динамическом прокси, а не реальным объектом, возвращаемым виндзором. Позвольте мне привести пример того, как это может усложнить ситуацию: допустим, у меня есть пользовательская коллекция, которая делает что-то, когда их элементы уведомляют об изменении свойства:

private void ItemChanged(object sender, PropertyChangedEventArgs e)
    {
        int senderIndex = IndexOf(sender);
        SomeActionOnItemIndex(senderIndex);
    }

Этот код не будет работать, если я добавлю прокси интерфейса, поскольку отправитель будет полем прокси интерфейса, а IndexOf (отправитель) вернет -1.

1 Ответ

5 голосов
/ 02 мая 2010

Да, вы можете:

_windsor.Register(Component.For<ProductServices, IProductServices>()
   .Interceptors(typeof(SomeInterceptorType));
...