У нас есть набор из примерно двух десятков классов, которые наследуются от базового класса, который имеет абстрактный метод Validate. Конечно, у каждого класса есть разные потребности в проверке, но правила нужны в разных комбинациях между ними, так что, как вы можете себе представить, это привело к большому дублированию кода, например:
Класс А нуждается в правилах 1, 3, 6 и 9
Класс B нуждается в правилах 3, 4 и 8
Классу С нужны правила 1, 8 и 9
....
вы получите картинку.
Поэтому я подумал о том, чтобы выполнить простой рефакторинг и создать декоратор валидации, в котором каждое правило будет инкапсулировано в классе, и фабрику, которая создаст комбинацию валидации adhoc для каждого класса.
Затем я начал думать, что каждое правило настолько простое, что вместо создания всей верстки для декоратора, я мог бы просто хранить делегаты Action, хранящиеся на фабрике, которые бы заполняли List(Action(T))
, чтобы каждый класс просто проходил через это список, выполняющий каждого делегата.
Проблема заключается в том, что количество и / или типы параметров варьируются в зависимости от каждого правила, например:
Правило 1 нуждается в обнуляемом DateTime, DateTime и перечислении.
Правило 2 нуждается в обнуляемом DateTime и DateTime.
Правило 3 нуждается в строке .....
Это что-то, что может быть выполнено, или у меня нет выбора, кроме как кодировать Декоратор?
Спасибо за ваши мысли и идеи.
UPDATE:
Некоторые примеры правил:
if(EndTime.HasValue && StartTime > EndTime)
Throw new Exception (...);
if(Status == StatusEnum.Pass && !EndTime.HasValue)
Throw new Exception (...);
if(string.IsNullOrEmpty(ProcessName))
Throw new Exception (...);
if(string.IsNullOrEmpty(ProductName))
Throw new Exception (...);
if(string.IsNullOrEmpty(CustomerName))
Throw new Exception (...);
Все участвующие классы имеют свойства DateTime? EndTime
, DateTime StartTime
, StatusEnum Status
и string ProcessName
.