TPL DataFlow和架构设计

时间:2017-01-30 22:10:39

标签: oop design-patterns architecture task-parallel-library tpl-dataflow

TPL DataFlow库对我的应用程序非常有用。我有大约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);
    ...
}

我需要将我的大工作流方法转换为OOP设计。我希望以后能够在我的工作流程中添加或删除步骤。可能有人解决了这个任务吗?

我认为Workflow最合适的架构是State设计模式,但我认为TPL DataFlow已经使用了这种模式,而且它将过度架构。

1 个答案:

答案 0 :(得分:1)

所有关于设计的问题都非常广泛,只有一个“银弹”解决方案很难回答。如果检查DataflowBlock extension class,我们会看到许多面向功能的重载,特别是那些处理彼此之间的链接块的重载。

因此,您可以做的最好的事情是在应用程序中为不同类型的流引入一些Factory和/或Builder。这样的类很容易为你的流程构建一个简单的模型而没有一些低级lambda。以下是实现目标的一些想法:

如您所知,块之间可以轻松链接,因此为您的流添加步骤非常容易。您还可以使用谓词链接块,以便消息直接转到您创建的特定块 取消链接块是一项更复杂的任务。如果您不再需要它,最简单的方法是save the reference to the IDisposable link and dispose it 其他选项是link the blocks with new DataflowLinkOptions { MaxMessages = N },但您需要知道给定链接要传递的确切消息数 还有一个简洁的选项作为Encapsulate方法,用于包装两个块之间的链接。

因此,就您所见,有很多机会在您的应用程序中创建一些流程,但您必须自己定义规则。 TPL Dataflow是一种开发工具,而不是架构模式。