Я ищу несколько советов о том, как разрешить легкую настройку и расширение основного продукта на основе каждого клиента. Я знаю, что это, наверное, слишком большой вопрос. Однако нам действительно нужно получить некоторые идеи, как будто мы получаем настройку этого неправильного, что может вызвать проблемы на протяжении многих лет. У меня нет большого опыта в настройке и расширении существующих продуктов.
У нас есть основной продукт, который мы обычно делаем на основе клиента. Недавно мы переписали продукт на С# 4 с интерфейсом MVC3. Мы реорганизовали и теперь имеем 3 проекта, которые составляют решение:
- Проект основной области (namespace - projectname.domain. *) - состоящий из моделей доменов (для использования EF), интерфейсов служб домена и т.д. (интерфейсы репозитория)
- Проект инфраструктуры домена (namespace -projectname.infrastructure. *) - реализует контекст контекста, репозитория EF, реализацию загрузки файлов/загрузки и т.д.
- MVC3 (namespace - projectname.web. *) - проект, состоящий из контроллеров, режимов просмотра, CSS, содержимого, скриптов и т.д. Он также имеет IOC (Ninject) обработку DI для проекта.
Это решение отлично работает как отдельный продукт. Наша проблема заключается в расширении и настройке продукта на основе клиента. Наши клиенты обычно хотят, чтобы основная версия продукта предоставлялась им очень быстро (обычно в течение нескольких дней после подписания контракта) с фирменным CSS и стилем. Однако 70% клиентов хотят, чтобы изменения изменили способ его функционирования. Некоторые настройки небольшие, такие как дополнительные свойства для модели домена, модели просмотра и представления и т.д. Другие более значительны и требуют совершенно новых моделей и контроллеров домена и т.д.
Некоторые настройки кажутся полезными для всех клиентов, поэтому периодически мы хотели бы изменить их из настроек и добавить их в ядро.
В настоящее время мы сохраняем исходный код в TFS. Чтобы запустить проект, мы обычно вручную копируем исходный код в новый Team Project. Измените пространство имен, чтобы отобразить имя клиента, и начните настраивать основные части, а затем разверните их на Azure. Это, очевидно, приводит к полностью дублированной базе кода, и я уверен, что это не правильный путь. Я думаю, что мы, вероятно, должны иметь что-то, что обеспечивает основные функции и расширяет/отменяет, когда это необходимо. Однако я действительно не уверен, как это сделать.
Итак, я ищу советы по лучшей конфигурации проекта, которые позволят:
- Быстрое развертывание кода - так легко начать новый клиент, чтобы разрешить брендинг/незначительные изменения.
- Предотвращение необходимости копирования и вставки кода
- Использование максимально возможного количества DI, чтобы держать его свободно связанным.
- Разрешить вызов кода на на основе клиента
- Возможность расширения основного продукта в одном и все клиенты получают эту функциональность, если мы получим последней версии ядра и повторного развертывания
Любая помощь/совет приветствуются. С удовольствием добавляем больше информации, которую кто-либо думает, поможет.