private static ConstructorInfo GetConstructor(ConstructorInfo[] constructors) { var suitableConstructors = new Dictionary <int, int> { { 0, constructors[0].GetParameters().Length } }; for (var i = 1; i < constructors.Length; i++) { var paramentersCount = constructors[i].GetParameters().Length; var maxParametersCount = suitableConstructors.First().Value; if (paramentersCount == maxParametersCount) { suitableConstructors.Add(i, paramentersCount); } else if (paramentersCount > maxParametersCount) { suitableConstructors.Clear(); suitableConstructors.Add(i, paramentersCount); } } if (suitableConstructors.Count != 1) { var exc = new ArmatureException("ConstructorsAmbiguty"); var counter = 0; foreach (var pair in suitableConstructors) { exc.Data.Add("Constructor" + counter++, constructors[pair.Key]); } throw exc; } return(constructors[suitableConstructors.First().Key]); }
public void Process(IBuildSession buildSession) { var exceptions = new List <Exception>(); foreach (var buildAction in _buildActions) { try { buildAction.Process(buildSession); if (!buildSession.BuildResult.HasValue) { Log.WriteLine(LogLevel.Trace, () => string.Format("{0} has not built value", buildAction)); } else { Log.WriteLine(LogLevel.Info, () => string.Format("redirected execution to {0}", buildAction)); _effectiveBuildActions.TryAdd(buildSession, buildAction); break; } } catch (ArmatureException exc) { LogException(exc); exceptions.Add(exc); // continue; } catch (Exception exc) { Log.WriteLine(LogLevel.Trace, () => string.Format("User exception was throw during executing {0}", buildAction)); LogException(exc); for (var i = 0; i < exceptions.Count; i++) { exc.AddData(i, exceptions[i]); } throw; } } if (!buildSession.BuildResult.HasValue && exceptions.Count > 0) { var exception = new ArmatureException("Multiply exceptions occured during processing build actions"); for (var i = 0; i < exceptions.Count; i++) { exception.AddData(i, exceptions[i]); } throw exception; } }
private List <Weighted <BuildResult> > BuildAllUnits(BuildChain buildChain, WeightedBuildActionBag?buildActionBag) { if (buildActionBag is null) { return(Empty <Weighted <BuildResult> > .List); } if (buildActionBag.Keys.Count > 1) { var exception = new ArmatureException($"Actions only for one stage should be provided for {nameof(BuildAllUnits)}"); var number = 1; foreach (var pair in buildActionBag) { exception.AddData($"Stage #{number++}", pair.Key); } throw exception; } var buildResultList = new List <Weighted <BuildResult> >(); foreach (var weightedBuildAction in buildActionBag.Values.Single()) { var buildSession = new Interface(this, buildChain); var buildAction = weightedBuildAction.Entity; BuildActionProcess(buildAction, buildSession); Log_BuildActionResult(buildAction, buildSession.BuildResult); BuildActionPostProcess(buildAction, buildSession); Log.WriteLine(LogLevel.Info, ""); if (buildSession.BuildResult.HasValue) { buildResultList.Add(buildSession.BuildResult.WithWeight(weightedBuildAction.Weight)); } } Log_BuildAllResult(buildResultList); return(buildResultList); }