いくつかのケースを考えてみましょう:
_windsor.Register(Component.For<IProductServices>().ImplementedBy<ProductServices>().Interceptors(typeof(SomeInterceptorType));
この場合、IProductServices を要求すると、windsor はインターフェイス メソッド呼び出しをインターセプトするためにインターフェイスをプロキシします。代わりにこれを行う場合:
_windsor.Register(Component.For<ProductServices>().Interceptors(typeof(SomeInterceptorType));
次に、windsor に IProductServices を解決するように要求することはできません。代わりに、ProductServices を要求すると、仮想メソッド呼び出しをインターセプトする動的サブクラスが返されます。もちろん、動的サブクラスはまだ「IProductServices」を実装しています
私の質問は: 最初のケースのようにインターフェイス コンポーネントを登録し、2 番目のケースのようにサブクラス プロキシを取得できますか?
これが必要な理由は 2 つあります
。1 - 解決しようとしているコードは、ProductServices クラスを認識できず、IProductServices インターフェイスしか認識できないため。2 - 送信者をパラメータとして渡す一部のイベント呼び出しは ProductServices オブジェクトを渡すため、最初のケースでは、このオブジェクトは動的プロキシのフィールドであり、windsor によって返される実際のオブジェクトではありません。これがどのように物事を複雑にするかの例を挙げましょう: 項目がプロパティの変更を通知したときに何かを行うカスタム コレクションがあるとしましょう:
private void ItemChanged(object sender, PropertyChangedEventArgs e)
{
int senderIndex = IndexOf(sender);
SomeActionOnItemIndex(senderIndex);
}
送信者がインターフェイス プロキシのフィールドになり、IndexOf(sender) が -1 を返すため、インターフェイス プロキシを追加すると、このコードは失敗します。