Castle Windsor拦截已注册的类而不是组件

时间:2013-01-01 03:06:52

标签: c# castle-windsor

我正在学习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());

似乎没有使用拦截器。

在注册多个类时是否有办法进行拦截?或者我是否需要单独注册每个组件才能完成此操作?

1 个答案:

答案 0 :(得分:2)

Configure上的BasedOnDescriptor方法提供了这种能力(以及配置许多其他内容的能力),但我刚才意识到因为Configure旨在采用Action<ComponentRegistration> 1}}您无法调用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; })
);