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

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

                CompensateActivityContext <TActivity, TLog> activityContext = context.CreateActivityContext(activity);

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

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

            var serviceScope = serviceProvider.CreateScope();

            try
            {
                serviceScope.UpdateScope(context);

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

                CompensateActivityContext <TActivity, TLog> activityContext = context.CreateActivityContext(activity);

                activityContext.UpdatePayload(serviceScope);

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

                throw;
            }
        }
Esempio n. 2
0
        public ICompensateActivityScopeContext <TActivity, TLog> GetScope(CompensateContext <TLog> context)
        {
            if (context.TryGetPayload <Scope>(out var existingScope))
            {
                existingScope.UpdateScope(context);

                var activity = existingScope
                               .Container
                               .GetInstance <TActivity>();

                CompensateActivityContext <TActivity, TLog> activityContext = context.CreateActivityContext(activity);

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

            var scope = AsyncScopedLifestyle.BeginScope(_container);

            try
            {
                scope.UpdateScope(context);

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

                CompensateActivityContext <TActivity, TLog> activityContext = context.CreateActivityContext(activity);

                var contextScope = scope;

                activityContext.UpdatePayload(scope);

                return(new CreatedCompensateActivityScopeContext <Scope, TActivity, TLog>(contextScope, activityContext));
            }
            catch
            {
                scope.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 = context.CreateActivityContext(activity);

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

            var parentLifetimeScope = _scopeProvider.GetLifetimeScope(context);

            var lifetimeScope = parentLifetimeScope.BeginLifetimeScope(_name, builder =>
            {
                builder.ConfigureScope(context);
                _configureScope?.Invoke(builder, context);
            });

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

                CompensateActivityContext <TActivity, TLog> activityContext = context.CreateActivityContext(activity);

                activityContext.UpdatePayload(lifetimeScope);

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

                throw;
            }
        }