public IExecuteActivityScopeContext <TActivity, TArguments> GetScope(ExecuteContext <TArguments> context)
        {
            if (context.TryGetPayload <IKernel>(out var kernel))
            {
                kernel.UpdateScope(context);

                var activity = kernel.Resolve <TActivity>(new Arguments().AddTyped(context.Arguments));

                ExecuteActivityContext <TActivity, TArguments> activityContext = context.CreateActivityContext(activity);

                return(new ExistingExecuteActivityScopeContext <TActivity, TArguments>(activityContext, ReleaseComponent));
            }

            var scope = _kernel.CreateNewOrUseExistingMessageScope();

            try
            {
                ExecuteContext <TArguments> scopeContext = new ExecuteContextScope <TArguments>(context, _kernel);

                _kernel.UpdateScope(scopeContext);

                var activity = _kernel.Resolve <TActivity>(new Arguments().AddTyped(context.Arguments));

                ExecuteActivityContext <TActivity, TArguments> activityContext = scopeContext.CreateActivityContext(activity);

                return(new CreatedExecuteActivityScopeContext <IDisposable, TActivity, TArguments>(scope, activityContext, ReleaseComponent));
            }
            catch
            {
                scope.Dispose();
                throw;
            }
        }
        public async ValueTask <IExecuteActivityScopeContext <TActivity, TArguments> > GetScope(ExecuteContext <TArguments> context)
        {
            if (context.TryGetPayload <IServiceScope>(out var existingServiceScope))
            {
                existingServiceScope.SetCurrentConsumeContext(context);

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

                ExecuteActivityContext <TActivity, TArguments> activityContext = context.CreateActivityContext(activity);

                return(new ExistingExecuteActivityScopeContext <TActivity, TArguments>(activityContext));
            }

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

            var serviceScope = serviceProvider.CreateScope();

            try
            {
                ExecuteContext <TArguments> scopeContext = new ExecuteContextScope <TArguments>(context, serviceScope, serviceScope.ServiceProvider);

                serviceScope.SetCurrentConsumeContext(scopeContext);

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

                ExecuteActivityContext <TActivity, TArguments> activityContext = scopeContext.CreateActivityContext(activity);

                return(new CreatedExecuteActivityScopeContext <IServiceScope, TActivity, TArguments>(serviceScope, activityContext));
            }
            catch
            {
                if (serviceScope is IAsyncDisposable asyncDisposable)
                {
                    await asyncDisposable.DisposeAsync().ConfigureAwait(false);
                }
                else
                {
                    serviceScope.Dispose();
                }

                throw;
            }
        }
示例#3
0
        public IExecuteActivityScopeContext <TActivity, TArguments> GetScope(ExecuteContext <TArguments> 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}'.");
                }

                ExecuteActivityContext <TActivity, TArguments> activityContext = context.CreateActivityContext(activity);

                return(new ExistingExecuteActivityScopeContext <TActivity, TArguments>(activityContext));
            }

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

            var serviceScope = serviceProvider.CreateScope();

            try
            {
                ExecuteContext <TArguments> scopeContext = new ExecuteContextScope <TArguments>(context, serviceScope, serviceScope.ServiceProvider);

                serviceScope.UpdateScope(scopeContext);

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

                ExecuteActivityContext <TActivity, TArguments> activityContext = scopeContext.CreateActivityContext(activity);

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

                throw;
            }
        }
示例#4
0
        public IExecuteActivityScopeContext <TActivity, TArguments> GetScope(ExecuteContext <TArguments> context)
        {
            if (context.TryGetPayload <Scope>(out var existingScope))
            {
                existingScope.UpdateScope(context);

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

                ExecuteActivityContext <TActivity, TArguments> activityContext = context.CreateActivityContext(activity);

                return(new ExistingExecuteActivityScopeContext <TActivity, TArguments>(activityContext));
            }

            var scope = AsyncScopedLifestyle.BeginScope(_container);

            try
            {
                ExecuteContext <TArguments> scopeContext = new ExecuteContextScope <TArguments>(context, scope);

                scope.UpdateScope(scopeContext);

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

                ExecuteActivityContext <TActivity, TArguments> activityContext = scopeContext.CreateActivityContext(activity);

                return(new CreatedExecuteActivityScopeContext <Scope, TActivity, TArguments>(scope, activityContext));
            }
            catch
            {
                scope.Dispose();

                throw;
            }
        }