2

Castle Windsor を学んでいて、AOP を使用していくつかの問題を解決しようとしていましたが、これを達成するために傍受機能を使用したいと考えていました。

次のようにして、単一のコンポーネントで動作させる方法を見つけました。

container.Register(Component.For<IInterceptor>()
                .ImplementedBy<BankServiceLogger>()
                .Named("BankServiceInteceptor"));

            container.Register(Component.For<IBankService>()
                .ImplementedBy<BankService>()
                .Interceptors(InterceptorReference.ForKey("BankServiceInteceptor")).Anywhere
                .LifestyleTransient());

私の問題は、ここで行ったようにコントローラーなどのクラスを登録するときです

container.Register(Classes.FromThisAssembly()
                .BasedOn<IController>()                
                .LifestyleTransient());

インターセプターがこれを使用しているようには見えません。

複数のクラスを登録するときにインターセプトを行う方法はありますか、またはこれを達成するために各コンポーネントを個別に登録する必要がありますか?

4

1 に答える 1

2

ConfigureメソッドBasedOnDescriptorはこの機能 (および他の多くのものを構成する機能) を提供しますが、インターセプターがコンポーネントに適用されないように、 のプロパティを呼び出すことができないようConfigureに設計されているためです登録。以下は、私が解決できる最善の回避策です。Action<ComponentRegistration>AnywhereInterceptorGroup

container.Register(Component.For<MyInterceptor>());
container.Register(Classes.FromThisAssembly()
    .BasedOn<IController>().WithService.FromInterface()
    .LifestyleTransient()
    //.Configure(c => c.Interceptors(InterceptorReference.ForType<MyInterceptor>()).Anywhere)
    .Configure(delegate(ComponentRegistration c) { var x = c.Interceptors(InterceptorReference.ForType<MyInterceptor>()).Anywhere; })
);
于 2013-01-01T06:35:21.777 に答える