public AppraisersFlow(IEnumerable <Appraiser> appraisers) : base(DataflowOptions.Default) { if (appraisers is null) { throw new ArgumentNullException(nameof(appraisers)); } _inputConsumer = new DataBroadcaster <IReadOnlyList <IData> >(crawlersData => { Console.WriteLine($"Broadcasts all crawlers data. {crawlersData.Count.ToString()}"); return(crawlersData); }, DataflowOptions.Default); _resultConsumer = new TransformBlock <IReadOnlyList <string>, IReadOnlyList <string> >( appraisedData => appraisedData ).ToDataflow(DataflowOptions.Default); var usedTypes = new Dictionary <Type, DataBroadcaster <IReadOnlyList <IData> > >(); foreach (var appraiser in appraisers) { if (!usedTypes.TryGetValue(appraiser.DataType, out var broadcaster)) { broadcaster = new DataBroadcaster <IReadOnlyList <IData> >(crawlersData => { Console.WriteLine($"Broadcasts specified data of type {appraiser.DataType.Name}. {crawlersData.Count.ToString()}"); return(crawlersData); }, DataflowOptions.Default); usedTypes.Add(appraiser.DataType, broadcaster); _inputConsumer.TransformAndLink( broadcaster, l => l, l => l.All(d => d.GetType().IsAssignableFrom(appraiser.DataType)) ); RegisterChild(broadcaster); } var appraiserFlow = DataflowUtils.FromDelegate(appraiser.Func, DataflowOptions.Default); broadcaster.LinkTo(appraiserFlow); appraiserFlow.LinkTo(_resultConsumer); _resultConsumer.RegisterDependency(appraiserFlow); RegisterChild(appraiserFlow); } RegisterChild(_inputConsumer); RegisterChild(_resultConsumer); }
private void InitFlow(IEnumerable <Funcotype> appraisers) { var usedTypes = new Dictionary <Type, DataBroadcaster <BasicInfo> >(); foreach (Funcotype appraiser in appraisers) { if (!usedTypes.TryGetValue(appraiser.DataType, out var broadcaster)) { broadcaster = new DataBroadcaster <BasicInfo>( crawlersData => crawlersData, DataflowOptions.Default ); usedTypes.Add(appraiser.DataType, broadcaster); _inputConsumer.TransformAndLink( broadcaster, info => info, info => info.GetType().IsAssignableFrom(appraiser.DataType) ); RegisterChild(broadcaster); } Dataflow <BasicInfo, RatingDataContainer> appraiserFlow = DataflowUtils.FromDelegate( appraiser.Func, DataflowOptions.Default ); broadcaster.LinkTo(appraiserFlow); appraiserFlow.LinkTo(_resultConsumer); _resultConsumer.RegisterDependency(appraiserFlow); RegisterChild(appraiserFlow); } RegisterChild(_inputConsumer); RegisterChild(_resultConsumer); }