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