3

我有一组位于队列中的服务(非 WCF)。当消息到达时,典型的服务会进行一些计算并将零个或多个结果消息输出到其输出队列。除了其主要功能外,每个服务都有一些管理逻辑,如身份验证/审计/日志记录/状态跟踪,确切的步骤和顺序在服务之间有所不同。这就是管道概念进入画面的地方。

我对我们最终得到的设计不满意,并寻找简化它的方法。我应该模仿 CCR 端口吗?ASP.NET 管道?奥普?还要别的吗?

我目前的设计如下:我有一个IMessageHandler<TMessage>接口和大约 15 个实现,它们使用 IoC 以 6 种独特的方式链接在一起。该接口定义了单个方法Handle(TMessage msg),因此每个实现都可以在将消息传递给菊花链中的下一个处理程序之前和之后执行一些逻辑。

这样做的问题是:很难记住每个实现究竟做了什么,以及为什么它们以这种特定的方式链接到这个特定的服务。另一方面,将每个方面放在自己的类中可以更好地分离关注点,从而更容易进行单元测试。

想法?我可以查看任何好的管道模式吗?我可以用作参考的任何不错的管道实现?还是我应该JFHCI

4

2 回答 2

2

我经常使用您选择的设计,但并不总是使用 IoC。

听起来您有“文档”问题。该代码没有很好地解释它的作用。我可以看到这个问题的几个解决方案。

首先,您可以大量注释您的代码。这通常是一种气味,并且很大程度上取决于实施。您还可以通过以特定方式命名您的 IoC 配置来就地评论。

其次,您可以创建对象块。例如,如果有三个对象倾向于一起运行,您可以创建一个“AuthorizeAndAudit”类,该类委托给其他对象(可能使用 IoC 和“插件系列”或您的容器调用它们的任何内容构建,如果支持的话)。这更好地将对象的意图联系在一起。我倾向于拥有一个 IMessageHandler 集合,它也实现了 IMessageHandler 并对其自身进行了 foreach。

第三,您可以分离出接口。听起来您可能会遇到这样一种情况,即您拆分对象只是因为它们包含在链的不同部分发生的动作。您可以为身份验证创建一个接口(或共享接口上的方法),为审核创建一个接口等。您的对象可以实现这些接口中的一个或多个。由于定义了接口的顺序(调用 Auth 然后 Audit 等),您的对象可以处理链中的多个步骤(最终得到链链),而无需拆分为单独的类。您甚至可能有一个对象,例如日志跟踪器,它位于所有链和日志上,因为每个步骤都被调用。

除此之外,您开始进入更复杂的事物,例如工作流,而 Windows 工作流可能是一个不错的选择。

于 2009-06-29T21:15:58.843 回答
2

我经常编写与您描述的代码相似的代码。为了使代码的意图清晰,我添加了一层“语法糖”,它构成了将在运行时完成应用程序工作的对象,并且还清楚地表达了最终对象图的作用。

Steve Freeman 和我写了一篇关于我们在 Java 中使用的技术来构建这一层语法糖的论文:http ://www.jmock.org/oopsla2006.pdf 。我在 C# 和其他 Algol 系列语言中使用了相同的技术,并构建了相当复杂的“特定领域嵌入式语言”,包括用于描述金融市场模型、分布式系统架构、通信协议栈、游戏中的精灵行为等的嵌入式语言上。

于 2009-06-29T21:24:37.563 回答