Я разрабатываю небольшое решение "Rule Engine". Основная идея модуля заключается в том, что он проверяет, удовлетворяют ли полученные взаимодействия с пользователем некоторым правилам, и если да, то начисляет им бонусные баллы. Короче говоря, есть набор интерфейсов List<IRule>
, когда пользователь взаимодействует с системой, скажем, покупает вещи, я перебираю все IRule
и проверяю, возвращает ли bool Execute(ITransactionContext context)
значение true. Вот интерфейс IRule
public interface IRule
{
bool Execute(IContext context);
}
И проблема в том, что конкретные Rule : IRule
классы отличаются друг от друга, имеют разные параметры и значения. Например.
AmountRule
имеетMin, Max
свойстваDatePeriodRule
имеет параметрыFrom
иTo
EqualsRule
имеет параметрыCheckProperty
иExpectedValue
и так далее... Это очень простые правила, могут существовать более сложные правила.public class AmountRule : IRule { private decimal _min; private decimal _max; public bool Execute(IContext context) { return context.Amount >= _min && context.Amount <= _max; } } public class DatePeriodRule : IRule { private DateTime _from; private DateTime _to; public bool Execute(IContext context) { return context.ProcessDate >= _from && context.ProcessDate <= _to; } }
Таким образом, создание правил — непростая задача, и я решил использовать шаблон Factory (или любой шаблон, связанный с ним, неважно, будет ли это Abstract Factory
, Factory Method
или Builder
) и иметь интерфейс, IRuleFactory
который отвечает за создание любого класса реализации IRule
.
public interface IRuleFactory
{
IRule Create(RuleType type);
}
Здесь я сталкиваюсь с реальной проблемой из-за разнообразия параметров для конкретных реализаций IRule
. Например. Если я хочу создать AmountRule
, то моему RuleFactory
нужны MinAmount, MaxAmount
параметры, если DatePeriodRule
нужны From, To
параметры и так далее...
Я ищу хорошие подходы к решению этой проблемы. Является ли Factory
просто дополнительной головной болью?