Podemos usar métodos de extensão para a construção de motores de regras de negócios?
-
20-09-2019 - |
Pergunta
Estou procurando fazer algo assim
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){}
}
Então, no código do cliente, use -o como
productBiz.Rule1().Rule2();
productBiz.Rule2().Rule1();
OU
// create multicasted delegate of type Func<ProductBiz,bool> say rulesetDelegate
productBiz.ApplyRules(rulesetDelegate);
Só queria perguntar antes de mergulhar profundamente e me afogar.
Quais são as possíveis armadilhas com essa abordagem ???
desde já, obrigado
Solução
Não tenho certeza do que você quer dizer com possível. Certamente é possível escrever um mecanismo de regras dessa maneira e você demonstrou um esboço de como conseguir isso.
Não se esqueça de que os métodos de extensão são apenas açúcar sintático sobre os métodos estáticos. Perguntar se você pode fazer X tipo de programação com métodos de extensão não é diferente de perguntar se você pode fazer X tipo de programação com métodos estáticos. Os métodos estáticos podem não parecer tão legais, mas são igualmente poderosos.
Outras dicas
Se você está olhando para mudar as regras em tempo de execução, pode considerar algo mais como Mef ou similar.
Sua solução está bem até você compilar, depois está definido e bloqueado, pelo som de seus comentários que você está procurando por flexibilidade em tempo de execução.
Veja a implementação de regras de negócios na CSLA http://lhotka.net/ . Na medida em que você define uma regra com uma assinatura específica e adicione -a ao armazenamento de regras do objeto, no nível de classe ou no nível da instância. A sintaxe do que você está tentando fazer é desanimador, mas o método (definindo regras de negócios por métodos estáticos que são executados no tempo de execução) é exatamente o que a CSLA faz.