/// <summary>
        /// Creates the service based on the service type.
        /// </summary>
        /// <param name="serviceType">Service type.</param>
        /// <param name="settings">Configuration settings.</param>
        /// <returns>Returns the service based on the service type.</returns>
        public static BaseAddressService Create(ConverterServiceType serviceType, Settings settings)
        {
            BaseAddressService service;

            switch (serviceType)
            {
            case ConverterServiceType.Lot:
                service = new LotBasedAddressService(settings);
                break;

            case ConverterServiceType.Street:
                service = new StreetBasedAddressService(settings);
                break;

            default:
                throw new NotSupportedException("Service type is not defined");
            }
            return(service);
        }
        /// <summary>
        /// Processes the update service.
        /// </summary>
        /// <param name="serviceType">Converter service type.</param>
        public void ProcessRequests(ConverterServiceType serviceType)
        {
            var service = this.GetService(serviceType);

            service.StatusChanged   += Status_Changed;
            service.ExceptionThrown += Exception_Thrown;

            service.ProcessRequests(service.SkipDownloadingFiles,
                                    service.SkipExtractingFiles,
                                    service.SkipConvertingFiles,
                                    service.SkipGeneratingXmlDocuments,
                                    service.SkipArchivingXmlDocuments,
                                    true);

            if (!service.SkipLoadingDatabase)
            {
                this.LoadDatabase(service.ExtractDirectory, serviceType);
            }

            service.EmptyDirectories(service.SkipEmptyingDirectories);
        }
        /// <summary>
        /// Loads extracted XML files to database.
        /// </summary>
        /// <param name="sourceDirectory">Source directory where the XML files are located.</param>
        /// <param name="serviceType">Converter service type.</param>
        private void LoadDatabase(string sourceDirectory, ConverterServiceType serviceType)
        {
            using (var context = new KoreanPostcodeAddressDataContext())
            {
                //  Drops and recreates tables.
                context.DropCreateTables(Convert.ToString(serviceType));
            }

            IList <string> filepaths;

            switch (serviceType)
            {
            case ConverterServiceType.Lot:
                filepaths = Directory.GetFiles(sourceDirectory).Where(p => p.EndsWith(".xml")).ToList();
                this.LoadLotBasedAddresses(filepaths);
                break;

            case ConverterServiceType.Street:
                filepaths = Directory.GetFiles(sourceDirectory).Where(p => p.EndsWith(".txt")).ToList();
                this.LoadStreetBasedAddresses(filepaths);
                break;
            }
        }
 /// <summary>
 /// Gets the converter service instance based on the converter service type.
 /// </summary>
 /// <param name="serviceType">Converter service type.</param>
 /// <returns>Returns the converter service instance based on the converter service type.</returns>
 private IBaseAddressService GetService(ConverterServiceType serviceType)
 {
     return(BaseAddressService.Create(serviceType, this._settings));
 }