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(); }