ProcessTransportMessage <TTransportMessage, TDomainMessage>( ITransportToDomainMessageTransform <TTransportMessage, TDomainMessage> messageTransform, ServiceProvider rootServiceProvider, IIocManagement <TTransportMessage> iocManagement, TTransportMessage transportMessage) { Option <TDomainMessage> domainMessageO = messageTransform.ToDomainMessage(transportMessage); OptionAsync <Either <IPipelineError, Tuple <TTransportMessage, TDomainMessage> > > result2 = domainMessageO.MapAsync(d => HandleDomainMessage( rootServiceProvider, iocManagement, transportMessage, d)); Task <Either < IPipelineError, Tuple <TTransportMessage, TDomainMessage> > > res = result2.Match( sm => sm, () => Prelude.Left((IPipelineError) new ErrorParsingTransportMessage())); return(res); }
Run <TTransportMessage, TDomainMessage>( IMessageSource <TTransportMessage> messageSource, ITransportToDomainMessageTransform <TTransportMessage, TDomainMessage> messageTransform, ServiceProvider rootServiceProvider, IIocManagement <TTransportMessage> iocManagement ) { Option <TTransportMessage> transportMessageO = await messageSource.Poll(); Option <Either <IPipelineError, Tuple <TTransportMessage, TDomainMessage> > > processMessageResult = await transportMessageO.MapAsync( transportMessage => ProcessTransportMessage( messageTransform, rootServiceProvider, iocManagement, transportMessage)).ToOption(); Either <IPipelineError, Tuple <TTransportMessage, TDomainMessage> > resFinal = processMessageResult.Match( mpr => mpr, () => Prelude.Left <IPipelineError>(new NoTransportMessageAvailable())); resFinal.IfRight(m => messageSource.Ack(m.Item1)); return(resFinal); }
HandleDomainMessage <TTransportMessage, TDomainMessage>( ServiceProvider rootServiceProvider, IIocManagement <TTransportMessage> iocManagement, TTransportMessage transportMessage, TDomainMessage domainMessage) { using (IServiceScope scope = rootServiceProvider.CreateScope()) { var scopeServiceProvider = scope.ServiceProvider; iocManagement.InitialiseScope(scopeServiceProvider, transportMessage); Either <IPipelineError, ObjectHander> handler = GetHandler(domainMessage, scopeServiceProvider); var res = handler.BindAsync(h => HandleMessage(h, transportMessage, domainMessage)); return(res); } }