2009-08-24 8 views
4

Je crée une application de paie dans .NET. L'une des exigences est que les règles de participation et de déduction soient dynamiques et flexibles dans la plus grande mesure possible. L'utilisateur devrait être capable de définir ses propres règles, où chaque employé sera lié à une règle de présence. Une solution consiste à compiler du code C# à la volée où le code de chaque règle d'assiduité est stocké dans la base de données et compilé au moment de l'exécution, mais ce n'est pas la solution la plus élégante puisque les règles ne peuvent être lues par une personne technique, la performance et la lisibilité du code ne sera pas la meilleure chose possible. Je me demande s'il existe un modèle solution \ architecture qui me permet de définir et d'appliquer des règles de fréquentation et de calculer les déductions en fonction de celles-ci sans écrire de scripts ou compiler dynamiquement du code C#.Architecture pour les règles métier dynamiques

Répondre

2

Boo est un langage .NET à part entière avec un compilateur extensible. Ayende a écrit un beau livre intitulé « Building Domain Specific Languages in Boo », où il aborde les sujets de l'extension d'un compilateur pour permettre quelque chose comme:

when User.is_preferred and Order.total_cost > 1000: 
    add_discount_precentage 5 
    apply_free_shipping 
when not User.is_preferred and Order.total_cost > 1000: 
    suggest_upgrade_to_preferred 
    apply_free_shipping 
when User.is_not_preferred and Order.total_cost > 500: 
    apply_free_shipping 

Lors de la compilation à l'assemblage .NET ces règles exécuteront extrêmement rapide. Vous devez toutefois exécuter le code généré dans un autre AppDomain afin de pouvoir le décharger en cas de modification des règles.

0

Vous pouvez intégrer un interpréteur et utiliser des modèles, des outils visuels pour permettre à vos utilisateurs d'ajouter de nouvelles fractions de code.

2

C'est une très mauvaise habitude de s'appuyer sur la compilation de code pour changer votre système, vous pourriez aussi bien dire "les règles peuvent être changées à tout moment, tout ce dont vous avez besoin est un développeur".

Si vous définissez vos règles, vous pouvez les stocker dans le DB et les appliquer avec le code qui les lit lors de l'exécution. Votre code sera plus complexe, mais c'est le prix que nous payons pour la configuration.

Vous devez définir les règles - c'est-à-dire dire formellement quels paramètres utiliser et comment ils peuvent être appliqués.

par ex. Si une présence de 90% signifie une déduction de 5%, vous stockez ces deux valeurs dans la base de données. Votre code obtiendra alors la présence effective, trouvera la ligne correspondante et appliquera la déduction. À moins que vos règles ne soient si complexes qu'elles ne puissent pas être modélisées dans des paramètres comme celui-ci, l'utilisation d'un système de configuration est la meilleure façon de procéder. Vous pouvez ensuite fournir une interface graphique simple aux utilisateurs pour ajuster les valeurs dans les règles.