Можем ли мы использовать методы расширения для создания движков бизнес-правил?
-
20-09-2019 - |
Вопрос
Я хочу сделать что-то подобное этому
public class ProductBiz: BizBase<Product> {
public List<String> BrokenRules {get;set;}
// Some kind of data + biz operation implementation
}
public static class ProductBizExtensions{
public ProductBiz Rule1(this ProductBiz prodBiz)
{}
public ProductBiz Rule2(this ProductBiz prodBiz)
{}
public bool ApplyRules (this ProductBiz prodBiz, Func<ProductBiz,bool> ruleset){}
}
Затем в клиентском коде используйте его как
productBiz.Rule1().Rule2();
productBiz.Rule2().Rule1();
или
// create multicasted delegate of type Func<ProductBiz,bool> say rulesetDelegate
productBiz.ApplyRules(rulesetDelegate);
Просто хотел спросить, прежде чем нырну глубоко и утону.
Каковы потенциальные подводные камни при таком подходе???
Заранее спасибо
Решение
Я не уверен, что вы подразумеваете под возможным.Безусловно, таким образом можно написать движок правил, и вы продемонстрировали, как этого добиться.
Не забывайте, что методы расширения - это просто синтаксический сахар поверх статических методов.Спрашивать, можете ли вы выполнять программирование типа X с помощью методов расширения, ничем не отличается от вопроса, можете ли вы выполнять программирование типа X со статическими методами.Статические методы могут выглядеть не так красиво, но они такие же мощные.
Другие советы
Если вы рассматриваете возможность изменения правил во время выполнения, то, возможно, вам захочется рассмотреть что-то более похожее МЕФ или что-то подобное.
Ваше решение работает нормально до тех пор, пока вы не скомпилируете, затем оно настроено и заблокировано, судя по вашим комментариям, вы ищете гибкость во время выполнения.
Посмотрите на реализацию бизнес-правил в CSLA http://lhotka.net/ .В этом случае вы определяете правило с определенной сигнатурой и добавляете его в хранилище правил объекта либо на уровне класса, либо на уровне экземпляра.Синтаксис того, что вы пытаетесь сделать, отталкивает, но метод (определение бизнес-правил с помощью статических методов, которые выполняются во время выполнения) - это именно то, что делает CSLA.