TPL数据流和架构设计

3

TPL 数据流库对我的应用非常有用。我有大约10个块,而且我认为这个数量会增加。

当我准备应用的原型时,我感到困惑,因为我意识到我已经得到了功能设计。

void BIG_WORKFLOW_METHOD()
{
    ...
    var block1 = new TransformBlock<string, string>(...);
    var block2 = new TransformBlock<string, string>(...);
    var block3 = new TransformManyBlock<string, string>(...);
    var broadCastBlock = new BroadcastBlock<EventObject>(ev => ev);
    ...
    var block9 = new ActionBlock<string>(...);
    var block10 = new ActionBlock<EventObject>(...);
    block1.LinkTo(block2);
    block2.LinkTo(block3);
    block3.LinkTo(block4);
    broadCastBlock.LinkTo(block5);
    broadCastBlock.LinkTo(block6);
    ...
}

我需要将我的大型工作流程方法转化为面向对象设计。我希望能够轻松地在未来添加或删除工作流程步骤。也许有人解决了这个问题?

我猜Workflow最合适的架构是状态设计模式,但我认为TPL DataFlow已经使用了这种模式,那会过度架构。

1个回答

1
所有关于设计的问题都非常广泛,很难用一个“万能解决方案”来回答。如果我们检查DataflowBlock扩展类,我们会看到许多面向功能的重载,尤其是那些处理链接块之间关系的重载。
因此,你最好做的是为应用程序中不同类型的流程引入一些工厂和/或构建器。这样的类可以轻松地构建一个简单的流程模型,而无需使用低级别的lambda表达式。以下是实现目标的一些想法:
如您所知,块之间可以轻松链接,因此添加流程步骤非常容易。您还可以使用谓词将块链接起来,以便消息直接发送到您创建的特定块。
解除块之间的链接是更复杂的任务。如果您不再需要它,最简单的方法是保存IDisposable链接的引用并将其处理掉
另一个选项是使用new DataflowLinkOptions { MaxMessages = N }链接块, 但是您需要知道要通过给定链接传递的确切消息数量。
还有一个很好的选项是使用Encapsulate方法封装两个块之间的链接。
因此,正如您所看到的,有许多机会在应用程序内部创建一些流程,但您必须自己定义规则。TPL Dataflow是一种开发工具,而不是架构模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接