2010-09-02 15 views
0

Supposons que j'ai un service StateService qui a une méthode ChangeState.Comment et quand appliquer des règles métier?

ChangeState(State toState, DomainObject object) 

je les règles métier qui vérifie si l'état de destination est valide ou non dans le domaine des objets « état » actuel, comment puis-je vérifier techniquement ces règles sans engager le toState sur l'objet de domaine? Il se sent mal à d'abord définir le nouvel état, exécuter la validation et si une ou plusieurs règles enfreignent l'état.

Une solution que je suis venu avec est de créer un objet de contexte qui conduit la validation par exemple. ChangeStateContext qui contient l'objet DomainObject avec l'état à définir.

Une autre question connexe est de savoir comment rendre compte de l'appel ChageState comment cela s'est passé?
Je peux rassembler toutes les règles de validation qui cassent et lancer une exception avec les règles que l'appelant peut attraper et gérer en conséquence ou je peux ajouter un type de retour sur la méthode ChangeState comme ValidationSummary qui contient des informations sur les règles brisées et autres. Quelles sont les meilleures pratiques dans ces cas?

Répondre

0

Vous ne pouvez pas lever une exception de la méthode ChangeState lorsque la transformation d'état est non valide? Vous pouvez lancer des exceptions spécifiques telles que StateTransformationException ou ValidationException que vous pouvez prendre plus haut dans la pile d'appels. Vous pouvez éventuellement inclure des propriétés supplémentaires à ces types d'exception afin que vous puissiez communiquer très précisément ce qui n'a pas fonctionné pour l'utilisateur.

Lorsque vous souhaitez appeler plusieurs ChangeStates après une seule action de l'utilisateur, vous aurez besoin d'un moyen de revenir en arrière ou de revenir en arrière. Ce que je fais habituellement est d'utiliser le modèle d'unité de travail (fourni par LINQ to SQL et Entity Framework) et de changer tout état dans cette unité de travail. Quand une exception est lancée, je jette l'unité de travail complète avec tous ses changements.

0

La classe DomainObject pourrait avoir une méthode d'instance public bool CanChangeState(State toState), retour True si toState est une transition valide de l'état actuel du sujet DomainObject. Une telle méthode peut être appelée avant l'appel StateService.ChangeState.

Bien sûr, si le StateService est responsable de la validation de changement d'état, une méthode CanChangeState(State toState, DomainObject obj) doit être ajoutée au StateService.

Pour renvoyer les messages d'erreur de validation, modifiez le type de retour du CanChangeState en un type personnalisé chargé de signaler les erreurs de validation.