管道系统设计

Designing pipeline system

背景

我有一组 tools\solution 可以组合成一个单一的数据 processing\action 流。

我流程中的每个单元都进行计算或执行操作。

示例:Solve equation -> send email

在这个例子中,Solve equation单位是一种计算单位。而 send email 单位是动作。

重点是我有 100 个不同的单元,可以按不同的顺序组合在一起。

问题

为了解决这个问题,我打算为我的应用程序创建一个数据流。每个流都会实现这个接口:

public interface IFlow
{
    public IUnit[] UnitsChain{get;}
    
    public void Start(string input);
}

虽然我的单位会实现这个接口:

public interface IUnit
{
    public string /*output*/ Process(string input);
}

这个设计中的一切听起来都是可行的,但也听起来像是我在“发明轮子”而不是使用允许这些选项的现有解决方案。

寻找更好的解决方案来实现这种自定义管道处理。

谢谢!

“这个设计中的一切听起来都是可行的,但也听起来像是我在“发明轮子”而不是使用允许这些选项的现有解决方案”

Microsoft 自己的 DataFlow 基本上通过非常方便的选项来提供此功能来并行化步骤等。

让我们分解一下:

求解方程

这听起来像是 TransformBlock 的工作。

您将其设置为使用一种转换方法,该方法将采用(我们称之为)TInput 类型并生成 TOutput(方程的结果)。

发送电子邮件

我会把它分成两个块:

  1. TOutput 转换为电子邮件
  2. 发送电子邮件

所以你还有一个Transformblock<TOutput , Email>和一个ActionBlock<Email>

(我在这里使用“Email”作为一种类型。它只是一个占位符。具体类型当然取决于所使用的电子邮件框架。)

把它们放在一起

然后通过“链接”构建管道 TransformBlock<TInput, TOutput> => TransformBlock<TOutput, Email> => ActionBlock<Email>.

完成后,您已经设置了一个完整的管道,您可以提交 TInputs,框架将处理剩下的事情。每个块可以是 conveniently configured,例如并行处理多个 TInput

它还让您决定是要使用同步还是异步 (Task/await) API.