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>你不能调用Anywhere属性,InterceptorGroup所以拦截器不会被应用到组件登记。以下是我可以解决的最佳解决方法。

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 回答