Стратегия использования аргументов командной строки с Unity DI? - PullRequest
1 голос
/ 23 июня 2011

Я использую инфраструктуру Unity для добавления ConfigurationProvider в некоторые из моих классов через следующий интерфейс:

interface IConfigurationProvider<T>{
    T GetConfiguration();
}

затем, в моем загрузчике с Unity,

container.RegisterType(typeof (IConfigurationProvider<DongleConfiguration>),
                               typeof (DongleConfigurationProvider));

До сих пор это была хорошая стратегия, которая позволила мне определить разных провайдеров конфигурации для различных реализаций и тестов.Теперь я хотел бы, чтобы один из провайдеров использовал аргументы командной строки для настройки объекта конфигурации, который требует от меня передачи параметра args в ctor:

class ProblematicConfigurationProvider : IConfigurationProvider<ProblematicConfiguration> {
    ...
    public ProblematicConfigurationProvider(string[] args) { ... }
    ...
}

Я прочиталчто я могу использовать ParameterOverride для предоставления необязательного аргумента ctor следующим образом:

var configObj =  container.Resolve<IConfigurationProvider<ProblematicConfiguration>>(new ParameterOverride("args", args));

Тем не менее, я использую DI "полностью" и полагаюсь на контейнер для разрешения зависимостей вниз по линии после разрешенияRootObject или каков мой класс высшего уровня.У меня вопрос, как теперь я могу использовать объект configObj, который я только что разрешил, если он спрятан где-то глубоко в моем графике зависимостей?Как я могу использовать разрешенный объект в другом вызове Resolve?Будет ли через аналогичное использование ParameterOverride?Есть ли способ где-нибудь настроить переопределение параметров и заставить Unity использовать его без фактического создания configObj?

1 Ответ

3 голосов
/ 24 июня 2011

Я бы сделал это по-другому. Добавьте класс CommandLineArguments в свой проект, который просто оборачивает аргументы командной строки. Как часть инициализации вашего контейнера, зарегистрируйте это в контейнере:

container.RegisterInstance(new CommandLineArguments(args));

Тогда ваш ConfigurationProvider должен иметь зависимость CommandLineArguments, а не string []. Оттуда он должен просто разрешить все естественным образом "до конца", не используя переопределения параметров.

Поскольку ваши аргументы командной строки не изменятся, на мой взгляд, это значительно упрощает задачу.

Примечание: я использую тип CommandLineArguments, потому что он намного более наглядно описывает происходящее. Вы можете зарегистрировать строку [] непосредственно в контейнере, но это может показаться мне немного странным, и, возможно, ввести аргументы командной строки там, где вы не ожидаете.

...