public void AddAppraisalRequirement(string appraisalRequirement)
        {
            ConfigContract.CheckAvailability(appraisalRequirement,
                                             ConfigContract.AvailableAppraisals);

            _appraisals.Add(appraisalRequirement);
        }
        public void AddServiceRequirement(string serviceRequirement)
        {
            ConfigContract.CheckAvailability(serviceRequirement,
                                             ConfigContract.AvailableServices);

            _services.Add(serviceRequirement);
        }
        public void AddOutputRequirement(string outputRequirement)
        {
            ConfigContract.CheckAvailability(outputRequirement, ConfigContract.AvailableOutput);

            _output.Add(outputRequirement);
        }
        public void AddInputRequirement(string inputRequirement)
        {
            ConfigContract.CheckAvailability(inputRequirement, ConfigContract.AvailableInput);

            _input.Add(inputRequirement);
        }
        /// <summary>
        /// Creates XML configuration according to the specified configuration data.
        /// </summary>
        /// <param name="configRequirements">Data which describes necessary configuration.</param>
        /// <returns>XML config of service as serialized set of classes.</returns>
        public static ConfigurationXml CreateXmlConfigBasedOnRequirements(
            ConfigRequirements configRequirements)
        {
            configRequirements.ThrowIfNull(nameof(configRequirements));

            var xmlConfigCreator = new XmlConfigCreator();

            xmlConfigCreator.SetMessageHandlerType("ConsoleMessageHandler");
            xmlConfigCreator.AddMessageHandlerParameter(
                new XElement("ConsoleMessageHandlerSetUnicode", "false")
                );

            xmlConfigCreator.SetDefaultInStorageName("thing_names.csv");

            xmlConfigCreator.SetCrawlersOutputFlag(false);

            xmlConfigCreator.SetAppraisersOutputFlag(false);

            xmlConfigCreator.SetDefaultOutStorageName("appraised_things.csv");

            xmlConfigCreator.SetConnectionString(
                ConfigurationManager.AppSettings["ConnectionString"]
                );
            xmlConfigCreator.AddRepository(
                ConfigModule.GetConfigForRepository("BasicInfo")
                );

            foreach (var inputItem in configRequirements.Input)
            {
                ConfigContract.CheckAvailability(inputItem, ConfigContract.AvailableInput);

                xmlConfigCreator.AddInputter(
                    ConfigModule.GetConfigForInputter(inputItem)
                    );
            }

            foreach (var serviceItem in configRequirements.Services)
            {
                ConfigContract.CheckAvailability(serviceItem, ConfigContract.AvailableServices);

                xmlConfigCreator.AddCrawler(
                    ConfigModule.GetConfigForCrawler(serviceItem)
                    );
                xmlConfigCreator.AddRepository(
                    ConfigModule.GetConfigForRepository(serviceItem)
                    );
            }

            foreach (var appraisalItem in configRequirements.Appraisals)
            {
                ConfigContract.CheckAvailability(appraisalItem, ConfigContract.AvailableAppraisals);

                xmlConfigCreator.AddAppraiser(
                    ConfigModule.GetConfigForAppraiser(appraisalItem)
                    );
            }

            foreach (var outputItem in configRequirements.Output)
            {
                ConfigContract.CheckAvailability(outputItem, ConfigContract.AvailableOutput);

                xmlConfigCreator.AddOutputter(
                    ConfigModule.GetConfigForOutputter(outputItem)
                    );
            }

            xmlConfigCreator.SetServiceType(ServiceType.TplDataflow);

            return(xmlConfigCreator.GetResult());
        }