我正在学习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());
似乎没有使用拦截器。
在注册多个类时是否有办法进行拦截?或者我是否需要单独注册每个组件才能完成此操作?
答案 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; })
);