5

让我们考虑一些情况:

_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。

4

1 回答 1

5

是的你可以:

_windsor.Register(Component.For<ProductServices, IProductServices>()
   .Interceptors(typeof(SomeInterceptorType));
于 2010-05-01T20:33:08.010 回答