Пример #1
0
        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;
            }
        }
Пример #3
0
    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);
    }