/// <summary>
 ///     Конструктор класса.
 /// </summary>
 /// <param name="sourceValidator">Распознаватель источников по пути.</param>
 /// <param name="sourceStorage">Хранилище с источниками.</param>
 /// <param name="indexChecker">Валидатор индекса под логику анализа.</param>
 /// <param name="fileInformationExtractor">Вытаскиватель данных о файлах.</param>
 /// <param name="indexedCache">Кэш данных по индексам.</param>
 /// <param name="fileSearcher">Поисковик имен всех файлов в источников.</param>
 public SimpleIndexingService(
     ISourceValidator sourceValidator,
     ISourceStorage sourceStorage,
     IIndexChecker indexChecker,
     IFileInformationExtractor fileInformationExtractor,
     IIndexedCache indexedCache,
     IFileSearcher fileSearcher)
 {
     this.sourceValidator = sourceValidator;
     this.sourceStorage = sourceStorage;
     this.indexChecker = indexChecker;
     this.fileInformationExtractor = fileInformationExtractor;
     this.indexedCache = indexedCache;
     this.fileSearcher = fileSearcher;
 }
        /// <summary>
        ///     Вернуть экземпляр сервиса.
        /// </summary>
        /// <param name="indexChecker">Валидатор индекса под логику поиска слова в файле.</param>
        /// <param name="rowChecker">Логика анализа данных файлов по индексу.</param>
        /// <exception cref="ArgumentException">
        ///     Если неправильно поданы параметры.
        ///     Либо оба null, либо оба не null
        /// </exception>
        /// <returns>Экземпляр сервиса.</returns>
        public IIndexingService GetIndexingService(
            IIndexChecker indexChecker = null,
            IRowChecker rowChecker = null)
        {
            if (this.indexingService == null)
            {
                lock (syncObject)
                {
                    if (this.indexingService == null)
                    {
                        this.indexingService = this.BuildIndexingService(indexChecker, rowChecker);
                    }
                }
            }

            return this.indexingService;
        }
        /// <summary>
        ///     Построить сервис.
        /// </summary>
        /// <param name="indexChecker">Валидатор индекса под логику поиска слова в файле.</param>
        /// <param name="rowChecker">Логика анализа данных файлов по индексу.</param>
        /// <returns>Экземпляр сервиса.</returns>
        private IIndexingService BuildIndexingService(IIndexChecker indexChecker, IRowChecker rowChecker)
        {
            if ((indexChecker != null) && (rowChecker == null) ||
                (indexChecker == null) && (rowChecker != null))
            {
                throw new ArgumentException("Both checkers should be setted or both should be null");
            }

            if (indexChecker == null)
            {
                indexChecker = new SingleWordIndexChecker();
                rowChecker = new SingleWordRowChecker();
            }

            var sourceValidator = new SimpleSourceValidator();
            var sourceStorage = new SafetySourceStorage(new SourceStorage());
            var fileInformationExtractor = new FileInformationExtractor();

            var fileInternalDataExtractor = new FileInternalDataExtractor();
            var fileDataCache = new SafetyFileDataCache(
                new FileDataCache(fileInternalDataExtractor));

            var filesInformationByIndexCacheFactory = new FilesInformationByIndexCacheFactory();
            var filesForIndexCacheFactory = new FilesForIndexCacheFactory();
            var indexedCache = new SafetyIndexedCache(new IndexedCache(
                rowChecker,
                fileDataCache,
                filesInformationByIndexCacheFactory,
                filesForIndexCacheFactory));

            var fileSearcher = new FileSearcher();

            return new SimpleIndexingService(
                sourceValidator,
                sourceStorage,
                indexChecker,
                fileInformationExtractor,
                indexedCache,
                fileSearcher);
        }