private async Task ValidateConfiguration()
        {
            Logger.LogInformation("Starting configuration validation");
            foreach (IConfigurationValidator validator in ClientHelpers.GetInstances <IConfigurationValidator>())
            {
                var stopwatch = Stopwatch.StartNew();
                Logger.LogInformation(LogDestination.File, $"Starting configuration validation for: {validator.Name}");

                await validator.Validate(context);

                stopwatch.Stop();
                Logger.LogInformation(LogDestination.File, $"Completed configuration validation for: {validator.Name} in {stopwatch.Elapsed.TotalSeconds}s");
            }

            Logger.LogInformation("Completed configuration validation");
        }
        private async Task TargetWorkItemValidation()
        {
            Logger.LogInformation("Starting target work item migration status");

            foreach (ITargetValidator validator in ClientHelpers.GetInstances <ITargetValidator>())
            {
                var stopwatch = Stopwatch.StartNew();
                Logger.LogInformation(LogDestination.File, $"Starting target work item migration status for: {validator.Name}");

                await validator.Validate(context);

                stopwatch.Stop();
                Logger.LogInformation(LogDestination.File, $"Completed target work item migration status for: {validator.Name} in {stopwatch.Elapsed.TotalSeconds}s");
            }

            Logger.LogInformation("Completed target work item migration status");
        }
        private async Task ValidateWorkItemMetadata()
        {
            Logger.LogInformation("Starting work item metadata validation");

            var validators = ClientHelpers.GetInstances <IWorkItemValidator>();

            foreach (var validator in validators)
            {
                await validator.Prepare(context);
            }

            var totalNumberOfBatches = ClientHelpers.GetBatchCount(context.WorkItemIdsUris.Count, Constants.BatchSize);

            await context.WorkItemIdsUris.Keys.Batch(Constants.BatchSize).ForEachAsync(context.Config.Parallelism, async(workItemIds, batchId) =>
            {
                var stopwatch = Stopwatch.StartNew();
                Logger.LogInformation(LogDestination.File, $"Work item metadata validation batch {batchId} of {totalNumberOfBatches}: Starting");

                var workItems = await WorkItemTrackingHelpers.GetWorkItemsAsync(
                    context.SourceClient.WorkItemTrackingHttpClient,
                    workItemIds,
                    context.RequestedFields);

                foreach (var validator in validators)
                {
                    Logger.LogInformation(LogDestination.File, $"Work item metadata validation batch {batchId} of {totalNumberOfBatches}: {validator.Name}");
                    foreach (var workItem in workItems)
                    {
                        await validator.Validate(context, workItem);
                    }
                }

                stopwatch.Stop();

                Logger.LogInformation(LogDestination.File, $"Work item metadata validation batch {batchId} of {totalNumberOfBatches}: Completed in {stopwatch.Elapsed.TotalSeconds}s");
            });

            Logger.LogInformation("Completed work item metadata validation");
        }