0

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

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

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

4

2 回答 2

2

你的提议:

  1. 使方法的实现依赖于存在的拦截器
  2. 引入拦截器之间的依赖关系。

这些都是坏事。

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

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

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

有趣的是消息检查器行为的实现本质上与拦截器相同。不同之处在于使您的方法依赖于显式行为是很清楚的。使方法依赖于隐式拦截器不是。

于 2012-10-26T15:05:53.163 回答
1

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

于 2012-10-26T10:57:53.160 回答