【问题标题】:TPL DataFlow and architecture designTPL DataFlow 和架构设计
【发布时间】:2017-01-30 22:10:38
【问题描述】:

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 已经使用了这种模式,这将是过度架构。

【问题讨论】:

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


    【解决方案1】:

    所有关于设计的问题都非常广泛,很难用一个“灵丹妙药”的解决方案来回答。如果检查DataflowBlock extension class,我们会看到许多面向函数的重载,尤其是处理彼此之间的链接块的重载。

    因此,您可以做的最好的事情是为您的应用程序中的不同类型的流引入一些工厂和/或生成器。这样的类可以轻松地为您的流程构建一个简单的模型,而无需一些低级 lambda。以下是实现目标的一些想法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-30
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 2017-12-22
      • 2010-09-28
      相关资源
      最近更新 更多