Esempio n. 1
0
            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;
            }
        }