Я работаю над "умным" приложением для отслеживания проблем, которое должно определить, может ли конкретная проблема быть подана в заявке, прежде чем фактически разрешить отправку.
Проблема проектирования, с которой я сталкиваюсь в настоящее время, заключается в том, что у меня может быть много разных типов «представляемых» проблем, каждая из которых имеет свою собственную уникальную бизнес-логику, которая определяет, может ли проблема действительно быть представлена. Из моих проектных заметок у меня следующие условия:
- Поддерживает несколько проблем (неизвестное число, теоретически может быть бесконечным)
- Каждая проблема напрямую связана с конкретной отправкой (т. Е. Пользователь выбирает свою проблему, а затем ему предлагается выбрать / ввести перевозку, с которой он имеет проблему)
- Каждая проблема имеет свои собственные проверки / бизнес-правила (данные предоставляются отгрузкой), которые определяют, может ли проблема продолжаться. Примеры будут:
- Если проблема связана с требованием о возмещении ущерба, груз должен быть получен в течение 60 дней.
- Если проблема связана с отменой или возмещением, статус доставки не может быть доставлен.
Идея почти похожа на приложение обработки страховки, но вся информация уже предоставляется путем запроса отгрузки, вместо того, чтобы полагаться на ввод пользователя (например, мне не нужно спрашивать, когда отправка была отправлена, я могу спросить объект отгрузки для его PickupDate), и есть только два результата: 1) У проблемы может быть открытое дело, или 2) Нет, у проблемы не может быть дела (так называемый вариант "неудачи"). С архитектурной точки зрения, даже если я использую какой-либо шаблон STRATEGY
, который может поддерживать несколько типов проблем, для каждого производного типа проблемы потребуется создать собственный класс. Например, мне понадобятся DamageClaimIssue
и CancellationRequestIssue
, и кто знает, что еще; это кажется громоздким на стороне разработчика, так как новые типы могут быть добавлены почти по прихоти и требуют от разработчика раскрутки нового производного класса и реализации логики проверки, а затем перекомпиляции и повторного развертывания.
Является ли использование Стратегии лучшим способом решения такой проблемы, или я что-то упускаю? Теоретически я хотел бы сделать архитектуру достаточно общей, чтобы учесть различные проблемы (я знаю, что их будет больше 2-3, я просто не знаю, какими они будут в точности), но я не хочу останавливаться на путь к наличию некоторого монолитного механизма рабочего процесса, использующего XML или аналогичный, который позволяет определять вещи на лету с помощью динамической логики. Я должен использовать стандартные библиотеки .NET 3.5 (то есть ничего подобного WCF или Workflow Foundation).
Какие-либо предложения или указатели, чтобы установить меня в правильном направлении?