在Castle Windsor,我可以注册一个接口组件并获得实现的代理吗?

Thi*_*uda 5 .net c# castle-windsor inversion-of-control interceptor

让我们考虑一些情况:

_windsor.Register(Component.For<IProductServices>().ImplementedBy<ProductServices>().Interceptors(typeof(SomeInterceptorType));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当我要求一个IProductServices时,windsor将代理接口拦截接口方法调用.如果相反,我这样做:

_windsor.Register(Component.For<ProductServices>().Interceptors(typeof(SomeInterceptorType));
Run Code Online (Sandbox Code Playgroud)

然后我不能要求windsor解析IProductServices,而是要求ProductServices,它将返回一个动态子类,它将拦截虚方法调用.当然动态子类仍然实现'IProductServices'

我的问题是:我可以像第一种情况一样注册接口组件,并像第二种情况一样获取子类代理吗?

我想
要这样做有两个原因:1 - 因为要解析的代码无法了解ProductServices类,只能了解IProductServices接口.2 - 因为一些将发送方作为参数传递的事件调用将传递ProductServices对象,并且在第一种情况下,此对象是动态代理上的字段,而不是windsor返回的真实对象.让我举一个如何使事情复杂化的例子:假设我有一个自定义集合,当它们的项目通知属性更改时会执行某些操作:

private void ItemChanged(object sender, PropertyChangedEventArgs e)
    {
        int senderIndex = IndexOf(sender);
        SomeActionOnItemIndex(senderIndex);
    }
Run Code Online (Sandbox Code Playgroud)

如果我添加了接口代理,此代码将失败,因为发送方将是接口代理中的字段,而IndexOf(发送方)将返回-1.

Krz*_*mic 5

是的你可以:

_windsor.Register(Component.For<ProductServices, IProductServices>()
   .Interceptors(typeof(SomeInterceptorType));
Run Code Online (Sandbox Code Playgroud)