【问题标题】:Pipeline of Interceptor by castle windsor温莎城堡拦截器管道
【发布时间】:2025-11-27 04:20:02
【问题描述】:

我想在一个名为 A 的类上创建一个拦截器管道。通过 pipleline i 表示每个拦截器都可以在调用类方法之前或之后执行一些处理,而不直接调用被拦截的方法,这与 Windsor 中拦截器的传统用法不同.假设以下示例我想在所有 A 类方法上应用两个拦截器 Interceptor1 和 Interceptor2。在未来的其他人中,也许会添加其他类型的拦截器。提供这些拦截器的顺序并不重要,谁应该调用该调用。继续,应该在哪里调用被拦截的方法。

public class A
{
    public virtual void DoSomething()
    {

    }
}
public class Interceptor1 : IInterceptor
{
    public virtual void Intercept(IInvocation invocation)
    {

    }
}

public class Interceptor2 : IInterceptor
{
    public virtual void Intercept(IInvocation invocation)
    {

    }
}

作为一个例子,假设我们想在进入类方法之前检查安全性、启动事务或类似的事情。需要指出的是,这些拦截器对于每个类都是不同的,并且在开发过程中可能会发生变化。 我们可以在 wcf 中看到这样的模式,我们使用操作行为或服务行为来控制整个服务或每个服务操作。

【问题讨论】:

    标签: castle-windsor interceptor pipeline


    【解决方案1】:

    我一定是个守旧派的城堡人,但这不就是工厂的用途吗?在每个类上打一个接口,让工厂在那个接口上工作。

    【讨论】:

    • 问题不在于如何构造接口或拦截器,这通常导致我们使用工厂的主要原因。问题是如何安排和管理拦截器,以便在类方法之前或之后做一些处理。
    • 对,我觉得这是一个不好的地方,因为它不容易被发现。这就是为什么我远离像这样的自定义 IoC 注册,并创建类似 DDD 的工厂来处理我的对象创建 - 请阅读:按照标准编码实践将 processing 之前和之后放在工厂的 Create() 方法中。它非常容易被发现,遵循企业模式,并且易于阅读。然后我在 IoC 中为该复杂对象注册工厂。
    • 如果你想出一个你需要用拦截器来做的情况,因为你必须访问你的 IoC 的内核/核心来执行一些其他核心 IoC 功能 - 我会说你应该退后一步如果您依赖 IoC 来实例化您的对象,请重新检查代码的结构。