Шаблон для разрешения вложенных зависимостей во время выполнения с использованием контейнера IoC - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть класс, который координирует процедуры подготовки, проверки и очистки пакета для файлов данных. Я изо всех сил пытаюсь найти образец, который чувствует себя хорошо при использовании контейнера IoC (Ninject в этом случае). Проблема, с которой я сталкиваюсь, заключается в том, что в зависимости от того, что доставлено в пакете, я могу использовать один из нескольких классов проверки. Вот примерное представление о том, что происходит:

public class PackageProcessor
{
    private readonly ILog log;

    public PackageProcessor(ILog log)
    {
        this.log = log;
    }

    public void Process(CustomerProfile profile, PackageType type, string path, bool validateOnly = false, bool offlineValidation = false)
    {
        // ...
        // Uncompress package files (if compressed) or copy raw files to woroking folder
        // Ensure working folder contains the required files for the package type
        // Validate package data
        foreach (var packageFile in packageConfiguration)
        {
            var timer = Stopwatch.StartNew();
            var recordCount = 0UL;
            var validator = DependencyResolver.Kernel.Get<RecordValidator>(metadata =>
                metadata.Has("file") &&
                String.Equals(metadata.Get<string>("file"), packageFile.Name, StringComparison.OrdinalIgnoreCase));

            using (var reader = new CsvReader(new StreamReader(Path.Combine(workingFolder.FullName, packageFile.Name)), false))
            {
                while (reader.ReadNextRecord())
                {
                    var recordResult = validator.IsValid(reader);
                    if(!recordResult.IsValid)
                    {
                        // LOG: record error messages
                        // Mark the job as failed
                    }
                    recordCount++;
                }
            }

            // LOG: File appears to be valid. {0} records were found.
            // LOG: File contains invalid records. {0} records were found, {1} were invalid.

            timer.Stop();
            log.Info(m => m(Strings.RecordsProcessed, recordCount, timer.Elapsed, (recordCount / timer.Elapsed.TotalSeconds)));
        }
        // Clean and output the data
    }
}

Как видите, мне нужно динамически разрешить класс валидации как часть процесса. В прошлом я бы создал класс Factory, чтобы найти правильный валидатор и вернуть его. Я склоняюсь к внедрению этой фабрики через конструктор, но хотел показать ее, чтобы увидеть, есть ли лучшие подходы, с которыми вы могли бы столкнуться при работе с разрешением вложенных зависимостей без необходимости передавать ссылки на контейнеры IoC.

(Возможно, дублирующий вопрос , но я все еще пытаюсь разобраться, если мы задаем то же самое)

1 Ответ

2 голосов
/ 07 апреля 2011

Если предположить, что валидаторы и процессор можно использовать повторно, я бы использовал совершенно другой подход.Я вставляю все RecordValidators в конструктор и добавляю к ним метод CanHandle (??? packageFile) и выбираю соответствующий в цикле или, альтернативно, внедряю селектор валидатора, имеющий все валидаторы, и получаю его от этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...