public ICompensateActivityScopeContext <TActivity, TLog> GetScope(CompensateContext <TLog> context)
        {
            if (context.TryGetPayload <IKernel>(out var kernel))
            {
                kernel.UpdateScope(context.ConsumeContext);

                var activity = kernel.Resolve <TActivity>(new Arguments(new { context.Log }));

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                return(new ExistingCompensateActivityScopeContext <TActivity, TLog>(activityContext, ReleaseComponent));
            }

            var scope = _kernel.CreateNewOrUseExistingMessageScope();

            try
            {
                _kernel.UpdateScope(context.ConsumeContext);

                var activity = _kernel.Resolve <TActivity>(new Arguments(new { context.Log }));

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);
                activityContext.UpdatePayload(_kernel);

                return(new CreatedCompensateActivityScopeContext <IDisposable, TActivity, TLog>(scope, activityContext, ReleaseComponent));
            }
            catch
            {
                scope.Dispose();
                throw;
            }
        }
        public ICompensateActivityScopeContext <TActivity, TLog> GetScope(CompensateContext <TLog> context)
        {
            if (context.TryGetPayload <IUnityContainer>(out var existingContainer))
            {
                var activity = existingContainer.Resolve <TActivity>(new DependencyOverride(typeof(TLog), InjectionParameterValue.ToParameter(context.Log)));

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                return(new ExistingCompensateActivityScopeContext <TActivity, TLog>(activityContext));
            }

            var scope = _container.CreateChildContainer();

            try
            {
                var activity = scope.Resolve <TActivity>(new DependencyOverride(typeof(TLog), InjectionParameterValue.ToParameter(context.Log)));

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                var contextScope = scope;
                activityContext.GetOrAddPayload(() => contextScope);

                return(new CreatedCompensateActivityScopeContext <IUnityContainer, TActivity, TLog>(contextScope, activityContext));
            }
            catch
            {
                scope.Dispose();

                throw;
            }
        }
        public ICompensateActivityScopeContext <TActivity, TLog> GetScope(CompensateContext <TLog> context)
        {
            if (context.TryGetPayload <IServiceScope>(out var existingContainer))
            {
                var activity = existingContainer.ServiceProvider.GetRequiredService <TActivity>();

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                return(new ExistingCompensateActivityScopeContext <TActivity, TLog>(activityContext));
            }

            var serviceScope = _serviceProvider.CreateScope();

            try
            {
                var activity = serviceScope.ServiceProvider.GetRequiredService <TActivity>();

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                var scope = serviceScope;
                activityContext.GetOrAddPayload(() => scope);
                activityContext.GetOrAddPayload(() => scope.ServiceProvider);

                return(new CreatedCompensateActivityScopeContext <IServiceScope, TActivity, TLog>(scope, activityContext));
            }
            catch
            {
                serviceScope.Dispose();

                throw;
            }
        }
        public ICompensateActivityScopeContext <TActivity, TLog> GetScope(CompensateContext <TLog> context)
        {
            if (context.TryGetPayload <IContainer>(out var existingContainer))
            {
                var activity = existingContainer
                               .With(context.Log)
                               .GetInstance <TActivity>();

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                return(new ExistingCompensateActivityScopeContext <TActivity, TLog>(activityContext));
            }

            var scopeContainer = _container.CreateNestedContainer(context.ConsumeContext);

            try
            {
                var activity = scopeContainer
                               .With(context.Log)
                               .GetInstance <TActivity>();

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                var scope = scopeContainer;
                activityContext.GetOrAddPayload(() => scope);

                return(new CreatedCompensateActivityScopeContext <IContainer, TActivity, TLog>(scope, activityContext));
            }
            catch
            {
                scopeContainer.Dispose();

                throw;
            }
        }
        public ICompensateActivityScopeContext <TActivity, TLog> GetScope(CompensateContext <TLog> context)
        {
            if (context.TryGetPayload <Scope>(out var existingContainer))
            {
                var activity = existingContainer
                               .Container
                               .GetInstance <TActivity>();

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                return(new ExistingCompensateActivityScopeContext <TActivity, TLog>(activityContext));
            }

            var scope = AsyncScopedLifestyle.BeginScope(_container);

            try
            {
                var activity = scope
                               .Container
                               .GetInstance <TActivity>();

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                var contextScope = scope;
                activityContext.GetOrAddPayload(() => contextScope);

                return(new CreatedCompensateActivityScopeContext <Scope, TActivity, TLog>(contextScope, activityContext));
            }
            catch
            {
                scope.Dispose();

                throw;
            }
        }
示例#6
0
        public ICompensateActivityScopeContext <TActivity, TLog> GetScope(CompensateContext <TLog> context)
        {
            if (context.TryGetPayload <INestedContainer>(out var existingContainer))
            {
                existingContainer.Inject(context.ConsumeContext);

                var activity = existingContainer.GetInstance <TActivity>();

                var activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                return(new ExistingCompensateActivityScopeContext <TActivity, TLog>(activityContext));
            }

            var nestedContainer = _container.GetNestedContainer(context.ConsumeContext);

            try
            {
                var activity = nestedContainer.GetInstance <TActivity>();

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                activityContext.UpdatePayload(nestedContainer);

                return(new CreatedCompensateActivityScopeContext <INestedContainer, TActivity, TLog>(nestedContainer, activityContext));
            }
            catch
            {
                nestedContainer.Dispose();
                throw;
            }
        }
        public ICompensateActivityScopeContext <TActivity, TLog> GetScope(CompensateContext <TLog> context)
        {
            if (context.TryGetPayload <ILifetimeScope>(out var existingLifetimeScope))
            {
                var activity = existingLifetimeScope.Resolve <TActivity>(TypedParameter.From(context.Log));

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                return(new ExistingCompensateActivityScopeContext <TActivity, TLog>(activityContext));
            }

            var parentLifetimeScope = _scopeProvider.GetLifetimeScope(context.ConsumeContext);

            var lifetimeScope = parentLifetimeScope.BeginLifetimeScope(_name, builder => builder.ConfigureScope(context.ConsumeContext));

            try
            {
                var activity = lifetimeScope.Resolve <TActivity>(TypedParameter.From(context.Log));

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                var scope = lifetimeScope;
                activityContext.GetOrAddPayload(() => scope);

                return(new CreatedCompensateActivityScopeContext <ILifetimeScope, TActivity, TLog>(scope, activityContext));
            }
            catch
            {
                lifetimeScope.Dispose();

                throw;
            }
        }
        public async Task Compensate(CompensateContext <TLog> context, IPipe <CompensateActivityContext <TLog> > next)
        {
            using (var scope = _lifetimeScope.BeginLifetimeScope(x => ConfigureScope(x, context)))
            {
                if (_log.IsDebugEnabled)
                {
                    _log.DebugFormat("CompensateActivityFactory: Compensating: {0}", TypeMetadataCache <TActivity> .ShortName);
                }

                var activity = scope.Resolve <TActivity>(TypedParameter.From(context.Log));

                var activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                await next.Send(activityContext).ConfigureAwait(false);
            }
        }
示例#9
0
        public ICompensateActivityScopeContext <TActivity, TLog> GetScope(CompensateContext <TLog> context)
        {
            if (context.TryGetPayload <IServiceScope>(out var existingServiceScope))
            {
                existingServiceScope.UpdateScope(context.ConsumeContext);

                var activity = existingServiceScope.ServiceProvider.GetService <TActivity>();
                if (activity == null)
                {
                    throw new ConsumerException($"Unable to resolve activity type '{TypeMetadataCache<TActivity>.ShortName}'.");
                }

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                return(new ExistingCompensateActivityScopeContext <TActivity, TLog>(activityContext));
            }

            if (!context.TryGetPayload(out IServiceProvider serviceProvider))
            {
                serviceProvider = _serviceProvider;
            }

            var serviceScope = serviceProvider.GetRequiredService <IServiceScopeFactory>().CreateScope();

            try
            {
                serviceScope.UpdateScope(context.ConsumeContext);

                var activity = serviceScope.ServiceProvider.GetService <TActivity>();
                if (activity == null)
                {
                    throw new ConsumerException($"Unable to resolve activity type '{TypeMetadataCache<TActivity>.ShortName}'.");
                }

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                activityContext.UpdatePayload(serviceScope);

                return(new CreatedCompensateActivityScopeContext <IServiceScope, TActivity, TLog>(serviceScope, activityContext));
            }
            catch
            {
                serviceScope.Dispose();

                throw;
            }
        }
示例#10
0
        public async Task Compensate(CompensateContext <TLog> context, IPipe <CompensateActivityContext <TActivity, TLog> > next)
        {
            TActivity activity = null;

            try
            {
                activity = _compensateFactory(context.Log);

                var activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                await next.Send(activityContext).ConfigureAwait(false);
            }
            finally
            {
                var disposable = activity as IDisposable;
                disposable?.Dispose();
            }
        }
        public async Task <ResultContext <CompensationResult> > Compensate(CompensateContext <TLog> context,
                                                                           IRequestPipe <CompensateActivityContext <TActivity, TLog>, CompensationResult> next)
        {
            TActivity activity = null;

            try
            {
                activity = _compensateFactory(context.Log);

                var activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                return(await next.Send(activityContext).ConfigureAwait(false));
            }
            finally
            {
                var disposable = activity as IDisposable;
                disposable?.Dispose();
            }
        }
        public async Task <ResultContext <CompensationResult> > Compensate(CompensateContext <TLog> context,
                                                                           IRequestPipe <CompensateActivityContext <TActivity, TLog>, CompensationResult> next)
        {
            using (var innerScope = _lifetimeScope.BeginLifetimeScope(x => ConfigureScope(x, context)))
            {
                if (_log.IsDebugEnabled)
                {
                    _log.DebugFormat("CompensateActivityFactory: Compensating: {0}", TypeMetadataCache <TActivity> .ShortName);
                }

                var activity = innerScope.Resolve <TActivity>(TypedParameter.From(context.Log));

                CompensateActivityContext <TActivity, TLog> activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                var consumerLifetimeScope = innerScope;
                activityContext.GetOrAddPayload(() => consumerLifetimeScope);

                return(await next.Send(activityContext).ConfigureAwait(false));
            }
        }
        public async Task Compensate(CompensateContext <TLog> context, IPipe <CompensateActivityContext <TLog> > next)
        {
            using (_kernel.RequireScope())
            {
                if (_log.IsDebugEnabled)
                {
                    _log.DebugFormat("CompensateActivityFactory: Compensating: {0}", TypeMetadataCache <TActivity> .ShortName);
                }

                var activity = _kernel.Resolve <TActivity>(new { context.Log, context.ConsumeContext });
                if (activity == null)
                {
                    throw new ConsumerException($"Unable to resolve activity type '{TypeMetadataCache<TActivity>.ShortName}'.");
                }

                var activityContext = new HostCompensateActivityContext <TActivity, TLog>(activity, context);

                await next.Send(activityContext).ConfigureAwait(false);
            }
        }