oop - TPL DataFlow 和架构设计

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

TPL DataFlow 库对我的应用程序非常有用。我有大约 10 个街区,我认为数量会增加。

当我准备我的应用程序原型(prototype)时,我很困惑,因为我明白我得到的是功能设计。

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 最合适的架构是状态设计模式,但我认为 TPL DataFlow 已经使用了这种模式,这将是过度架构。

最佳答案

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

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

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

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

关于oop - TPL DataFlow 和架构设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41946288/

相关文章:

oop - 根据类型检查确定状态是否有代码味道?

ios - 如何为 iphone 应用程序设置代码框架

c# - 抽象类使用哪个具体类?设计问题?

oop - 我应该使用异常来检查构造函数中的无效参数吗?

python - 在两个属性中拆分类属性

java - 如何使用对象字符串来实例化对象

oop - 在 OOP 编程风格中,为什么我们要隐藏对象的数据成员以防止其他人直接访问

java - 公共(public)方法调用具有相同名称的私有(private)方法——这是什么模式?

java - 在 Java 中实现 Creator 类和类本身设计的正确方法是什么?

cocoa - Cocoa 中的并发网络客户端