Какой самый подходящий способ применить принцип Open-Closed в этом приложении с использованием C #? - PullRequest
1 голос
/ 30 июля 2010

Сценарий

Каждую ночь мы выполняем серию расчетов по миллиону клиентских контрактов. Каждый контракт связан с одним из группы из примерно десяти продуктов, каждый из которых может использовать вариации в наборе расчетов для выполнения (хотя общий поток в основном одинаков). Все контракты для данного продукта будут использовать один и тот же набор расчетов в любую ночь; Распределение неравномерно, хотя колеблется от нескольких тысяч для самого маленького продукта до нескольких сотен тысяч для самого крупного.

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

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

Рассматривая архитектуру, я твердо привержен принципу Open-Closed :

Программные объекты должны быть открыты для расширение, но закрыто для модификация.

Поскольку мы планируем реализовать в C #, я рассматриваю возможность определения функций, которые должны быть определены внешним образом для ядра, загружены в текстовой форме и скомпилированы в начале выполнения для продукта под управлением текущей версии. определение продукта. Каждый из этих компонентов будет компилироваться в класс, который реализует интерфейс (или эквивалентный), как определено в скомпилированном элементе приложения. Я с оптимизмом смотрю, что это будет считаться плюсом с точки зрения операций, поскольку объем регрессионных тестов резко сокращается.

Вопрос (ы)

Имеет ли это смысл? Кто-нибудь может предложить мудрый совет относительно потенциальных ловушек?

Я заново изобретаю внедрение зависимостей, и мне лучше посоветовать вносить регулярные изменения, скажем, каждый раз предоставляя новую DLL? Если да, насколько хуже это делает наш ежедневный процесс разработки продукта?

Или мне следует использовать более гибкий подход, создать один продукт из конца в конец и добавить поочередно остальные, чтобы увидеть, какая архитектура возникает при рефакторинге?

Если вы все еще со мной, спасибо за ваше терпение ...

1 Ответ

1 голос
/ 30 июля 2010

Использование внедрения зависимостей для создания класса с методом процесса, который принимает параметр IProcess. Создайте отдельный класс для каждого типа продукта, который реализует этот интерфейс, каждый класс должен быть в своей собственной DLL. Создайте файл конфигурации для сопоставления типа продукта с обработкой dll и класса. Затем вы можете использовать отражение, прочитать файл конфигурации и загрузить соответствующие библиотеки DLL, и они передадут их в функцию процесса класса DI. Таким образом, вы можете добавить новый процесс, просто создав новую DLL и обновив файл конфигурации. Изменение существующих процессов - это просто вопрос обновления соответствующего класса и повторного развертывания библиотеки DLL.

...