1

作成したインターセプターを動作させようとしていますが、何らかの理由で、コンポーネントを要求したときにインターセプターがインスタンス化されていないようです。私はこのようなことをしています(これが完全にコンパイルされていない場合は許してください。しかし、あなたはアイデアを得る必要があります):

container.Register(
    Component.For<MyInterceptor>().LifeStyle.Transient,
    AllTypes.Pick().FromAssembly(...).If(t => typeof(IView).IsAssignableFrom(t)).
    Configure(c => c.LifeStyle.Is(LifestyleType.Transient).Named(...).
                   Interceptors(new InterceptorReference(typeof(MyInterceptor)).
    WithService.FromInterface(typeof(IView)));

インターセプターのコンストラクターにブレークポイントを設定しましたが、まったくインスタンス化されていないようです。

以前は、XML 構成を使用してインターセプターを登録していましたが、流暢なインターフェースを使用したいと思っています。

どんな助けでも大歓迎です!

4

1 に答える 1

6

悪用していると思いますWithService.FromInterface。ドキュメントは言う:

実装を使用して、サブ インターフェイスを検索します。例: IService と IProductService がある場合: ISomeInterface、IService、ISomeOtherInterface。FromInterface(typeof(IService)) を呼び出すと、IProductService が使用されます。すべてのサービスを登録したいが、すべてを指定したくない場合に便利です。

も欠落していInterceptorGroup Anywhereます。これが実際のサンプルです。サンプルからできるだけ変更せずに機能させました。

[TestFixture]
public class PPTests {
    public interface IFoo {
        void Do();
    }

    public class Foo : IFoo {
        public void Do() {}
    }

    public class MyInterceptor : IInterceptor {
        public void Intercept(IInvocation invocation) {
            Console.WriteLine("intercepted");
        }
    }

    [Test]
    public void Interceptor() {
        var container = new WindsorContainer();

        container.Register(
            Component.For<MyInterceptor>().LifeStyle.Transient,
            AllTypes.Pick()
                .From(typeof (Foo))
                .If(t => typeof (IFoo).IsAssignableFrom(t))
                .Configure(c => c.LifeStyle.Is(LifestyleType.Transient)
                                    .Interceptors(new InterceptorReference(typeof (MyInterceptor))).Anywhere)
                .WithService.Select(new[] {typeof(IFoo)}));

        container.Resolve<IFoo>().Do();
    }
}
于 2009-07-28T04:05:38.360 に答える