Внедрение и поддержка специфических для клиента отклонений в исходном коде - PullRequest
0 голосов
/ 02 марта 2011

У меня есть приложение ETL, которое извлекает данные из исходной базы данных (для которой у меня есть только права на чтение) и загружает их в мою базу данных SQL Server. Извлечение выполняется с использованием запросов ODBC из приложения C # с жестко закодированными операторами SQL. Загрузка выполняется с помощью хранимых процедур в моей базе данных SQL Server. Сначала все это работало нормально, но по мере роста числа клиентов мне пришлось вводить ряд специфических для клиента изменений в извлечении (код c #) и загрузке (хранимые процедуры).

Мой вопрос: как лучше всего справляться с этими специфическими для клиента различиями?

Ниже приведены мои первоначальные соображения о возможных решениях, я буду рад любым комментариям. Такое ощущение, что, возможно, есть лучший способ сделать это с помощью контроля версий? Создание филиалов для разных клиентов? (текущий источник контроля - SourceSafe, но я использую GIT с целью его реализации в ближайшее время)

Код приложения (C #)

В настоящее время я думаю о том, чтобы добавить параметр app.config для идентификации клиента и использовать его для запуска различных методов в извлечении.

Хранимые процедуры (SQL Server)

Я мог бы хранить дубликаты любых процедур, которые могли бы быть специфическими для клиента, с суффиксом с именем клиента. Затем при развертывании я могу удалить процедуры для других клиентов и переименовать ту, которую я хочу сохранить.

Итак, скажем, у меня есть клиент A и клиент B, и я могу получить 3 версии процедуры:

LoadDepartment ()
LoadDepartmentClientA ()
LoadDepartmentClientB ()

При развертывании для клиента A я удаляю LoadDepartment () и LoadDepartmentClientB (), затем переименовываю LoadDepartmentClientA () в LoadDepartment ().

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

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Создайте dll для каждого клиента, где каждый класс определяется интерфейсом, чтобы спецификация была ясной.

В этой dll вы должны поместить классы / методы, содержащие отклонения.

Загрузка специфичной для клиента сборки должна выполняться с помощью отражения (assembly.loadfrom)

Пример:

У вас есть CustomerA.dll и CustomerB.dll, оба имеют класс Department сМетод Load.Класс Department реализует IDepartment, который находится в CustomerHelper.dll.

0 голосов
/ 02 марта 2011

Как правило, решение «код / ​​плагин / конфигурация» более понятно и проще в обслуживании, но иногда преимущество хранимых процедур заключается в том, что их проще менять на лету в производственной среде.

Исправить в хранимой процедуре легко с помощью Enterprise Manager или аналогичного инструмента, но может быть сложно изменить dll на удаленном сервере.

...