Я занимаюсь рефакторингом небольшого приложения, генерирующего отчеты, и заставляю его придерживаться принципов SOLID и т. д. Итак, все мои классы следуют SRP с DI, и я использую app.config для большинства вариантов параметров. Я пока не использую какие-либо DI-фреймворки, а создаю все классы зависимостей в точке входа приложения. Однако это привело к вопросу дизайна, который я обобщаю здесь:
Я могу создать свои зависимости и основные классы репортеров следующим образом:
//dependencies
var sharedDependency = new SharedDependency();
var whiteColorDependency = new ColorDependency("white");
var blueColorDependency = new ColorDependency("blue");
var config1Dependency = new MultiDependency("config1");
var config2Dependency = new MultiDependency("config2");
...
var config12Dependency = new MultiDependency("config12");
//main logic
var reporter1 = new Reporter(sharedDependency, whiteColorDependency, config1Dependency);
var reporter2 = new Reporter(sharedDependency, whiteColorDependency, config2Dependency);
var reporter3 = new Reporter(sharedDependency, whiteColorDependency, config3Dependency);
...
var reporter10 = new Reporter(sharedDependency, blueColorDependency, config10Dependency);
var reporter11 = new Reporter(sharedDependency, blueColorDependency, config11Dependency);
var reporter12 = new Reporter(sharedDependency, blueColorDependency, config12Dependency);
или вот так:
foreach (var config in configs)
{
//dependencies
var sharedDependency = new SharedDependency();
var colorDependency = new ColorDependency("color");
var configDependency = new MultiDependency("config");
//main logic
var reporter = new Reporter(sharedDependency, colorDependency, configDependency);
reporter.DoSomething();
}
?
(Значения «colors» и «config» взяты из файла app.config и не жестко запрограммированы. Вышеупомянутое является обобщением, как я уже сказал, и реальный проект имеет больше зависимостей, зависимостей зависимостей, причем некоторые из них более общие, чем другие.)
Первый подход более эффективен, поскольку CSharedDependency создается только один раз, а CColorDependency — только дважды. (Это также более читабельно для меня.) Однако второй полностью зависит от конфигурации, поэтому не требует обслуживания и полностью расширяем.
Итак, какой из них является лучшим дизайном?
config
... - person Mark Seemann   schedule 01.02.2016.config
для цветов и значений конфигурации - это мой вопрос. Могу ли я создать общие зависимости вне цикла - да, это метод 1. Проблема в том, что я должен явно указать, какие изReporters
используютwhiteColorDependency
, а какие используютblueColorDependency
. Итак, если бы я добавил еще два (или пять)Reporters
, мне пришлось бы изменить код. С циклическим подходом все полностью управляется.config
и очень расширяемо... Но мне нужно было бы иметь 12+ экземпляровColorDependency
вместо 2. - person Alex R.   schedule 01.02.2016.config
. Где? - person Mark Seemann   schedule 01.02.2016ConfigurationManager.AppSettings["white"]
,ConfigurationManager.AppSettings["blue"]
. То же самое для config1 до config12. - person Alex R.   schedule 02.02.2016