Какова хорошая структура решения, позволяющая легко настраивать продукт для каждого клиента?

Я ищу совета о том, как упростить настройку и расширение основного продукта для каждого клиента. Я знаю, что это, вероятно, слишком большой вопрос. Однако нам действительно нужно получить некоторые идеи, поскольку, если мы неправильно настроим это, это может вызвать у нас проблемы на годы. У меня нет большого опыта в настройке и расширении существующих продуктов.

У нас есть основной продукт, который мы обычно разрабатываем индивидуально для каждого клиента. Недавно мы переписали продукт на C# 4 с интерфейсом MVC3. Мы провели рефакторинг, и теперь у нас есть 3 проекта, которые составляют решение:

  • Основной проект домена (пространство имен — имя_проекта.домен.*) — состоит из моделей домена (для использования EF), интерфейсов службы домена и т. д. (интерфейсы репозитория)
  • . ] Проект инфраструктуры домена (пространство имен -projectname.infrastructure.*) — который реализует доменную службу — контекст EF, реализацию репозитория, реализацию интерфейса загрузки/выгрузки файлов и т. д.
  • MVC3 (пространство имен — projectname.web.*) — проект, который состоит из контроллеров, моделей просмотра, CSS, контента, скриптов и т. д. Он также имеет IOC (Ninject), обрабатывающий DI для проекта.

Это решение прекрасно работает как самостоятельный продукт. Наша проблема заключается в расширении и настройке продукта для каждого клиента.Наши клиенты обычно хотят, чтобы версия основного продукта была предоставлена ​​им очень быстро (обычно в течение нескольких дней после подписания контракта) с фирменным CSS и стилем. Однако 70% клиентов хотят, чтобы настройки изменили его работу. Некоторые настройки невелики, например, дополнительные свойства модели предметной области, модели представления и представления и т. д. Другие являются более значительными и требуют совершенно новых моделей предметной области и контроллеров и т. д.

Некоторые настройки кажутся полезными для всех клиентов, поэтому периодически мы хотели бы изменить их от настройки и добавить их в ядро.

В настоящее время мы храним исходный код в TFS. Чтобы начать проект, мы обычно вручную копируем исходный код в новый командный проект. Измените пространство имен, чтобы оно отражало имя клиента, и начните настройку основных частей, а затем выполните развертывание в Azure. Это, очевидно, приводит к полностью дублированной кодовой базе, и я уверен, что это неправильный путь. Я думаю, у нас, вероятно, должно быть что-то, что предоставляет основные функции и расширяет/переопределяет, где это необходимо. Однако я действительно не уверен, как это сделать.

Поэтому я ищу любые советы по наилучшей конфигурации проекта, которая позволила бы:

  • Быстрое развертывание кода — так легко запустить новый клиент для разрешить брендинг/незначительные изменения
  • Предотвратить необходимость копирования и вставки кода
  • Использовать как можно больше DI, чтобы сохранить его слабо связанным
  • Разрешить заказ кода на на клиентскую базу
  • Возможность расширения основного продукта за один раз разместить и сделать так, чтобы все клиенты получили эту функциональность, если мы получим последняя версия ядра и повторное развертывание

Любая помощь/совет приветствуется. Рад добавить больше информации, которая, по мнению любого, поможет.

10
задан GraemeMiller 3 May 2012 в 09:10
поделиться