public async Task Send(ConsumerConsumeContext <T> context, IPipe <ConsumerConsumeContext <T> > next) { var unitOfWork = context.GetOrAddPayload <IUnitOfWork>(() => new UnitOfWork()); try { await next.Send(context).ConfigureAwait(false); unitOfWork.Commit(); } catch { unitOfWork.Abandon(); throw; } }
IConsumerScopeContext <TConsumer, T> IConsumerScopeProvider.GetScope <TConsumer, T>(ConsumeContext <T> context) { if (context.TryGetPayload <IServiceScope>(out var existingServiceScope)) { var consumer = existingServiceScope.ServiceProvider.GetService <TConsumer>(); if (consumer == null) { throw new ConsumerException($"Unable to resolve consumer type '{TypeMetadataCache<TConsumer>.ShortName}'."); } ConsumerConsumeContext <TConsumer, T> consumerContext = context.PushConsumer(consumer); return(new ExistingConsumerScopeContext <TConsumer, T>(consumerContext)); } var scopeFactory = _serviceProvider.GetRequiredService <IServiceScopeFactory>(); var serviceScope = scopeFactory.CreateScope(); try { var scope = serviceScope; var consumer = scope.ServiceProvider.GetService <TConsumer>(); if (consumer == null) { throw new ConsumerException($"Unable to resolve consumer type '{TypeMetadataCache<TConsumer>.ShortName}'."); } ConsumerConsumeContext <TConsumer, T> consumerContext = context.PushConsumerScope(consumer, scope); consumerContext.GetOrAddPayload(() => scope.ServiceProvider); return(new CreatedConsumerScopeContext <IServiceScope, TConsumer, T>(scope, consumerContext)); } catch { serviceScope.Dispose(); throw; } }