2

TPL DataFlow библиотека очень полезна для моего приложения. У меня около 10 блоков, и я думаю, что счет увеличится.TPL DataFlow и архитектурный дизайн

Когда я подготовил прототип своего приложения, я смутился, потому что понял, что получил функциональный дизайн.

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

Все вопросы о дизайне очень широкие и труднодоступные, с единственным решением «серебряной пули». Если посмотреть на DataflowBlock extension class, мы увидим много перестроек, ориентированных на функционал, и, тем более, тот, который имеет дело с связующими блоками между собой.

Итак, самое лучшее, что вы можете сделать, это ввести некоторые Factory и/или Builder для разных типов потоков в вашем приложении. Такие классы легко могут построить легкую модель для вашего потока без каких-либо низкоуровневых лямбдов. Вот несколько соображений для достижения вашей цели:

Как вы уже знаете, блоки могут быть легко связаны между собой, поэтому добавлять шаги для вашего потока очень просто. Также вы можете связать блоки с предикатом, чтобы сообщения переходили непосредственно к определенному блоку, который вы создали.
Открепление блоков - более сложная задача. Самый простой способ сделать это - save the reference to the IDisposable link and dispose it, если он вам больше не нужен.
Другой вариант - link the blocks with new DataflowLinkOptions { MaxMessages = N }, но вам нужно знать точное количество сообщений, которые будут доставлены по данной ссылке.
Также есть опрятный вариант, как метод Encapsulate для обвязки связи между двумя блоками.

Итак, насколько вы можете видеть, есть много возможностей для создания потока внутри вашего приложения, но вы должны сами определять правила. TPL Dataflow - это инструмент разработки, а не шаблон архитектуры.

Смежные вопросы