Вы можете прибегнуть к архитектуре с плагинами, где все (или большинство) функций реализованы в виде плагинов, расширяющих функциональность основного приложения. Таким образом, ваши издания будут отличаться только тем, какие сборки устанавливаются/отправляются/и т. Д.
Конечно, при таком подходе вы всегда можете сделать выпуск «Стартер», чтобы превратиться в «Профессионал», просто скопировав отсутствующие сборки. Чтобы решить эту проблему, вам все равно придется прибегать к условной компиляции, но вам придется условно компилировать блоки, которые несут ответственность за загрузку этих плагинов.
Например, для вашего профессионального издания вы хотите добавить, скажем, функцию экспорта. С этой целью вы создаете отдельный интерфейс плагина IExporter
. Вот как вы справиться с этим:
public IExporter GetExporter(FormatType format)
{
#if PROFESSIONAL_EDITION
return ExporterRegistry.GetExporter(format);
#else
return NullExporter();
#endif
}
Таким образом, ваше профессиональное издание будет иметь возможность быть продлен с пользовательскими IExporter
с, в то время как непрофессиональных изданий, даже со всеми сборками «Профессионал» в месте, не будет в состоянии использовать эту функциональность.
«Ветви» затруднят поддержание по мере увеличения количества выпусков. – Faisal