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」を実装しています

私の質問は: 最初のケースのようにインターフェイス コンポーネントを登録し、2 番目のケースのようにサブクラス プロキシを取得できますか?

これが必要な理由は 2 つあります
。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 に答える