Рассмотрим некоторые случаи:
_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.