让我们考虑一些情况:
_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 对象,而在第一种情况下,该对象是动态代理上的一个字段,而不是 Windsor 返回的真实对象。让我举一个例子来说明这如何使事情复杂化:假设我有一个自定义集合,当他们的项目通知属性更改时会做一些事情:
private void ItemChanged(object sender, PropertyChangedEventArgs e)
{
int senderIndex = IndexOf(sender);
SomeActionOnItemIndex(senderIndex);
}
如果我添加了接口代理,此代码将失败,因为发送者将是接口代理中的字段,并且 IndexOf(sender) 将返回 -1。