Я хочу сделать что-то вроде этого
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.
Если вы посмотрите на изменение правил во время выполнения, вы можете подумать о чем-то более похожем на MEF или аналогичном,
Ваше решение в порядке, пока вы не скомпилируете его, а затем установите и заблокируйте, из звука ваших комментариев вы ищете гибкость во время выполнения.
Rule1
действительно бытьRule2
?