Можем ли мы использовать методы расширения для создания движков бизнес-правил?

StackOverflow https://stackoverflow.com/questions/1529283

Вопрос

Я хочу сделать что-то подобное этому

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top