Пример #1
0
        public EthereumStepsManager(
            IEthereumStepsLoader loader,
            EthereumRunnerContext context,
            ILogManager logManager)
        {
            if (loader == null)
            {
                throw new ArgumentNullException(nameof(loader));
            }

            _context = context ?? throw new ArgumentNullException(nameof(context));
            _logger  = logManager?.GetClassLogger <EthereumStepsManager>()
                       ?? throw new ArgumentNullException(nameof(logManager));

            _allSteps           = loader.LoadSteps(_context.GetType()).ToList();
            _allStepsByBaseType = _allSteps.ToDictionary(s => s.StepBaseType, s => s);
        }
        public async Task DiscoverAll(CancellationToken cancellationToken)
        {
            var types = GetType().Assembly.GetTypes()
                        .Where(t => !t.IsInterface && IsStepType(t))
                        .GroupBy(GetStepBaseType);

            Type?GetStepType(IEnumerable <Type> sameStepSubtypes)
            {
                Type?GetStepTypeRecursive(Type?contextType)
                {
                    bool HasConstructorWithParameter(Type?type, Type?parameterType) =>
                    type?.GetConstructors()
                    .Any(c => c.GetParameters().Select(p => p.ParameterType).SequenceEqual(new[] { parameterType }))
                    ?? false;

                    if (contextType == typeof(object))
                    {
                        return(null);
                    }

                    Type stepTypeForContext = sameStepSubtypes.Where(t => !t.IsAbstract)
                                              .FirstOrDefault(t => HasConstructorWithParameter(t, contextType));

                    return(stepTypeForContext != null
                        ? stepTypeForContext
                        : GetStepTypeRecursive(contextType?.BaseType));
                }

                return(sameStepSubtypes.Count() == 1 ? sameStepSubtypes.First() : GetStepTypeRecursive(_context.GetType()));
            }

            foreach (IGrouping <Type?, Type> typeGroup in types.Where(t => t != null))
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    break;
                }

                Type?type = GetStepType(typeGroup);
                if (type != null)
                {
                    if (_logger.IsDebug)
                    {
                        _logger.Debug($"Discovered Ethereum step: {type.Name}");
                    }
                    _discoveredSteps[type] = false;

                    Type?baseType = GetStepBaseType(type);
                    if (baseType != null)
                    {
                        _hasFinishedExecution[baseType] = false;
                    }
                }
            }

            await ReviewDependencies(cancellationToken);
        }
        public void DiscoverAll()
        {
            var types = GetType().Assembly.GetTypes()
                        .Where(t => !t.IsInterface && IsStepType(t))
                        .GroupBy(GetStepBaseType);

            Type?GetStepType(Type[] typesInGroup)
            {
                Type?GetStepTypeRecursive(Type?contextType)
                {
                    bool HasConstructorWithParameter(Type?type, Type?parameterType) =>
                    type?.GetConstructors()
                    .Any(c => c.GetParameters().Select(p => p.ParameterType).SequenceEqual(new[] { parameterType }))
                    ?? false;

                    if (contextType == typeof(object))
                    {
                        return(null);
                    }

                    Type stepTypeForContext = typesInGroup.Where(t => !t.IsAbstract)
                                              .FirstOrDefault(t => HasConstructorWithParameter(t, contextType));

                    return(stepTypeForContext != null
                        ? stepTypeForContext
                        : GetStepTypeRecursive(contextType?.BaseType));
                }

                return(typesInGroup.Length == 0 ? typesInGroup[0] : GetStepTypeRecursive(_context.GetType()));
            }

            foreach (IGrouping <Type?, Type> typeGroup in types.Where(t => t != null))
            {
                Type?type = GetStepType(typeGroup.ToArray());
                if (type != null)
                {
                    if (_logger.IsDebug)
                    {
                        _logger.Debug($"Discovered Ethereum step: {type.Name}");
                    }
                    _discoveredSteps[type] = false;

                    Type?baseType = GetStepBaseType(type);
                    if (baseType != null)
                    {
                        _hasFinishedExecution[baseType] = false;
                    }
                }
            }

            ReviewDependencies();
        }