我正在开发一个使用 Castle Windsor 的项目,其中混合使用了装饰器和动态拦截来向根实现添加功能。
例如,假设我正在处理需要进行一些缓存以及通用错误日志记录的数据访问层的一部分,如下所示:
interface IRepository
{
/* . . . */
}
// base implementation
class SqlRepository : IRepository
{
/* . . . */
}
// decorator to implement caching
class CachingRepository : IRepository
{
private readonly IRepository _base;
/* . . . */
}
// interceptor to implement generic logging
class LoggingInterceptor : IInterceptor
{
/* . . . */
}
到目前为止一切顺利,除了我不确定如何最好地实现切入点。我想确保拦截器不会应用于装饰器链中的每个对象。相反,它应该只应用于最外层的装饰器。在这种情况下,它应该被应用于CachingRepository
而不是SqlRepository
. 我在实际解决方案中有很多类,所以如果可能的话,我想使用拦截器选择器来完成它,以避免手动应用拦截器的大量重复代码。
这就是我卡住的地方。显然我不想将它硬编码到 中IModelInterceptorsSelector
,因为每当装饰器的选择或应用它们的顺序发生变化时,需要提供拦截器的特定对象可能会有所不同。到那时,我相信坚持手动注册会容易得多。而且我想不出任何可以完成这项工作的约定。
那么,可以做到吗?还是我应该接受我的命运,.Interceptors(InterceptorReference.ForType<. . .
进入我的剪贴板,然后开始使用一些 IWindsorInstaller?