2012-01-10 3 views
4

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

Есть ли какие-либо рамки (для любого языка программирования), которые помогают в этом?

Чтобы добавить более подробную информацию, пользовательский интерфейс основан на веб-интерфейсе и написан с использованием JSP.

+2

язык агностик для конфигурации? Я так не думаю ..... –

ответ

3

Это одно из самых сложных бизнес-требований для управления различными версиями одного и того же приложения, поэтому не ожидайте открытых фреймворков для этого случая, однако каждая участвующая компания разрабатывает свою собственную систему для этого.

Что касается бизнес-логики изменений, вы можете воспользоваться для сильного взаимодействия и формирования IoC (такие как Spring). Вы переопределите службы для своего конкретного случая и измените необходимые методы, а затем введете в IoC измененную версию службы.

Что касается UI, это сложнее, потому что вы выбрали JSP, который имеет небольшую гибкость. Когда вы будете программировать в Swing или GWT, чем вы могли бы модифицировать интерфейс так же - переопределить необходимые классы пользовательского интерфейса, изменить их, вносить модифицированные версии. С JSP - возможно, будет много изменений в .jsp-файлах в вашей настраиваемой версии.

Теперь изменение изменения/исправление ошибок - полностью используется система управления версиями. Конечно, ваши клиентские версии - это ветви, а основная стандартная версия - это багажник. Исправлены ошибки, связанные с соединительными линиями, затем объединены с филиалами, зависящими от клиента. С интерфейсами/переопределяющими реализациями большинство слияний было бы простым способом, однако, с JSP, я ожидал бы, что конфликты будут часто ...

Как правило, смена кода проще, чем что-либо на основе XML.

2

Как насчет простых OOP? Настройте реалистичный интерфейс/базовый класс и, в зависимости от какой-либо конфигурации, создайте экземпляр дочернего класса A или B, в зависимости от клиента. Трудно представить более подробные сведения по языковому агностическому вопросу, подобным этому, но я думаю, что это очень реалистично.

+0

Спасибо за ответ. Как насчет элементов пользовательского интерфейса? –

2

Одним из решений этой проблемы, распространенной в мире Win32/.NET, является перенос специфического для клиента «кода» в файлы ресурсов. Многие .NET-проекты (.NET имеет встроенную поддержку этого шаблона через пространство имен System.Resources) используют этот шаблон для интернационализации, помещая строки пользовательского интерфейса в один файл на каждый язык и затем загружая строки пользовательского интерфейса из соответствующего файла во время выполнения.

Как этот шаблон применим к приложению JSP? Ну, здесь вы можете сохранить один файл ресурсов на клиент (или вместо файлов, использовать базу данных) и загружать пользовательские настройки из файла ресурсов всякий раз, когда вы обслуживаете страницу.

Скажите, например, что ваш самый большой клиент хочет, чтобы их логотип был наложен на какую-то часть каждой веб-страницы вашего сайта. Ваша страница может загрузить свойство CustomerLogo и использовать его как атрибут src для изображения HTML на той части страницы. Если вы обслуживаете страницу важного клиента, вы загружаете URL-адрес «/static/images/importantCustomerLogo.png», и в противном случае вы возвращаетесь к файлу ресурсов по умолчанию, который указывает URL-адрес «/static/images/logo.png «.

Таким образом, вы можете абстрагироваться от кода для загрузки свойств в один или два файла Java и просто использовать эти свойства на веб-сайте. Единственной частью вашей кодовой базы, которая зависит от клиента, будет набор файлов ресурсов, и они могут быть в чистом XML-формате, который легко читать и модифицировать. В результате люди, которые не разработали приложение в первую очередь, могут модифицировать XML без необходимости сначала считывать код, поэтому вам не нужно будет поддерживать файлы ресурсов - отдел продаж может выполнить эту работу за вас.

1

GWT делает это из коробки с помощью функции под названием deferred binding

При компиляции приложения GWT компилятор на самом деле генерирует различные версии кода для каждого целевого различных браузеров. это делается автоматически из коробки с компонентами GWT, которые заботятся о разных деталях браузера.

Эта функция может быть расширена до произвольных компиляций продукта на основе пользовательских свойств. здесь приведен упрощенный пример: предположим, у вас есть разные определения представлений для нормального и детального просмотра

public abstract class AbstractView { ....} 
public abstract class NormalView extends AbstractView { ... } 
public abstract class DetailedView extends AbstractView { ....} 

вы можете создать определение модуля, который будет генерировать два различных варианта, один с помощью NormalView класс другой, используя DetailedView (в вашем gwt.XML-файл)

<define-property name="customMode" values="normal,detailed" /> 

<replace-with class="com.example.NormalView"> 
    <when-type-is class="com.example.AbstractView" /> 
    <when-property-is name="customMode" value="normal" /> 
</replace-with> 

<replace-with class="com.example.DetailedView"> 
    <when-type-is class="com.example.AbstractView" /> 
    <when-property-is name="customMode" value="detailed" /> 
</replace-with> 

использованием

AbstractView view = GWT.create(AbstractView.class); 

обеспечит соответствующий экземпляр во время выполнения.

Это зависит от вас, чтобы инкапсулировать ваш конкретный код клиента в определенные классы и выставить общие интерфейсы для разных реализаций.

Вам также необходимо выбрать соответствующую скомпилированную версию, согласно клиент в настоящее время просмотра (вы можете использовать JSP для этого.)


пожалуйста, не берут образцы кода выше протестированы, там могут быть проблемы с синтаксисом, он просто намеревался передать общую идею


JSP бэкенд является идеальным хостинг среды для приложения GWT, вы сможете воспользоваться requestfactory м echanism для легкой связи между клиентом и сервером.

Очевидно, что здесь есть кривая обучения, IMO official documentation - хорошее место для начала.

0

Я думаю, что вы можете попробовать прочитать статьи (или книги), связанные с OSGi ... Эта платформа даст вам очень прагматичный ответ на ваши проблемы модульности. Он специально разработан, чтобы иметь возможность обрабатывать различные модули, живущие вместе с зависимостей и версий. Как упоминалось в начале ответа, инъекция зависимостей через объявления OSGi Declarative Services является очень ценной альтернативой Spring, с динамическими возможностями. Развертывание пакета, предоставляющего службу, и ваши ссылки будут автоматически обновляться, отбрасывая их, и они также будут обновлены ... Посмотрите на эту технологию и задайте несколько вопросов после? С уважением jerome

Смежные вопросы