管道系统设计
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
(方程的结果)。
发送电子邮件
我会把它分成两个块:
- 将
TOutput
转换为电子邮件
- 发送电子邮件
所以你还有一个Transformblock<TOutput , Email>
和一个ActionBlock<Email>
(我在这里使用“Email”作为一种类型。它只是一个占位符。具体类型当然取决于所使用的电子邮件框架。)
把它们放在一起
然后通过“链接”构建管道 TransformBlock<TInput, TOutput>
=> TransformBlock<TOutput, Email>
=> ActionBlock<Email>
.
完成后,您已经设置了一个完整的管道,您可以提交 TInput
s,框架将处理剩下的事情。每个块可以是 conveniently configured,例如并行处理多个 TInput
等
它还让您决定是要使用同步还是异步 (Task/await) API.
背景
我有一组 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
(方程的结果)。
发送电子邮件
我会把它分成两个块:
- 将
TOutput
转换为电子邮件 - 发送电子邮件
所以你还有一个Transformblock<TOutput , Email>
和一个ActionBlock<Email>
(我在这里使用“Email”作为一种类型。它只是一个占位符。具体类型当然取决于所使用的电子邮件框架。)
把它们放在一起
然后通过“链接”构建管道 TransformBlock<TInput, TOutput>
=> TransformBlock<TOutput, Email>
=> ActionBlock<Email>
.
完成后,您已经设置了一个完整的管道,您可以提交 TInput
s,框架将处理剩下的事情。每个块可以是 conveniently configured,例如并行处理多个 TInput
等
它还让您决定是要使用同步还是异步 (Task/await) API.