在温莎城堡的拦截器之间传递数据

时间:2012-10-26 10:17:36

标签: wcf dependency-injection castle-windsor interceptor

我正在为我的WCF项目采用Castle Windsor,并对此感到非常惊讶。但是,我有一个场景,我不知道Castle Windsor是否支持。 例如,我有以下链式拦截器

Interceptor 1 > Interceptor 2 > Interceptor 3 > Interceptor 4 > Real method

拦截器1返回一些数据,我想在Interceptor 2中使用它 拦截器2依次工作并返回我想在3,4拦截器中进行avaialbe的数据。 实际情况是我们有一个WCF服务,Interceptor 1会将请求标头解析为Header对象(用户名,密码等)。后面的拦截器和实际方法将使用这个Header对象。 我知道我可以使用Session变量来传输数据,但它是一种内置的,更优雅,更可靠的方法来处理它吗?

2 个答案:

答案 0 :(得分:2)

您提出的建议:

  1. 使方法的实现依赖于存在的拦截器
  2. 介绍拦截器之间的依赖关系。
  3. 这些都是坏事。

    概念拦截器是decorator pattern的一个很好的实现。换句话说,拦截器可以修改行为,但应该以对其下面的层透明的方式执行此操作。拦截器不应该更改公共接口或被调用的依赖项。拦截器可以依赖于最终方法,但最终方法不应该依赖于拦截器。

    如果调用该方法需要一个头对象,我会创建一个显式的WCF行为(可能是IDispatchMessageInspector)来填充需求。

    然后所有的拦截器和最终方法都可以假设头对象在那里,因为创建它是公共接口的一部分(例如,通过使用属性将行为放在方法实现上)。

    有趣的是,消息检查器行为的实现与拦截器基本相同。不同之处在于使您的方法依赖于显式行为是明确的。使方法依赖于隐式拦截器不是。

答案 1 :(得分:1)

我认为没有任何内置方法可以做到这一点,虽然你可以使用Session,但我宁愿为此定义一个抽象。您可以在需要通信的所有拦截器中注入相同的抽象实例。