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); 
    ... 
} 

큰 워크 플로 메서드를 OOP 디자인으로 변환해야합니다. 나중에 워크 플로에서 단계를 추가하거나 제거 할 수 있기를 원합니다. 누군가 그 일을 해결할 수 있습니까?

워크 플로에 가장 적합한 아키텍처는 상태 디자인 패턴이라고 생각하지만 TPL DataFlow는 이미이 패턴을 사용하고 있으며 이는 과도한 설계자가 될 것입니다.

답변

1

디자인에 관한 모든 질문은 단 하나의 "총알"솔루션으로 매우 광범위하고 대답하기가 어렵습니다. DataflowBlock extension class을 살펴보면 많은 functonal 지향적 인 오버로드를 볼 수 있으며, 특히 서로 간의 연결 블록을 처리하는 오버로드를 볼 수 있습니다.

여러분이 할 수있는 가장 좋은 방법은 응용 프로그램에서 다양한 유형의 플로에 대해 Factory 및/또는 Builder를 소개하는 것입니다. 이러한 클래스는 저수준 람다 없이도 쉽게 흐름 모델을 만들 수 있습니다. 목표를 달성하기위한 몇 가지 생각이 있습니다.

이미 알고 있듯이 블록은 서로 쉽게 연결될 수 있으므로 흐름을 추가하는 것은 매우 쉽습니다. 또한 블록을 술어와 연결하여 메시지를 작성한 특정 블록으로 직접 이동할 수 있습니다.
블록 연결을 해제하는 것은 더 복잡한 작업입니다. 더 이상 필요하지 않으면 가장 쉬운 방법은 save the reference to the IDisposable link and dispose it입니다.
다른 옵션은 link the blocks with new DataflowLinkOptions { MaxMessages = N }이지만 특정 링크와 함께 전달되는 정확한 메시지 수를 알아야합니다.
또한 두 블록 사이에 링크를 감싸는 방법으로 Encapsulate이라는 깔끔한 옵션이 있습니다.

당신이 볼 수있는 한, 앱 내부에서 약간의 흐름을 만들 수있는 많은 기회가 있지만 직접 규칙을 정의해야합니다. TPL Dataflow는 아키텍처 패턴이 아닌 개발 도구입니다.

관련 문제