2 votes

Motif de conception pour un service de notification par email qui surveille le flux de travail / l'état.

Je suis désolé, cette question va être un peu vague car je ne suis pas tout à fait sûr de ce que je cherche.

Fondamentalement, dans mon application web (Asp.net MVC), j'ai un workflow de base (codé manuellement) déclenché par mes différentes entrées utilisateur.

J'ai besoin d'envoyer des notifications par e-mail configurables lorsque certains événements se produisent.

Par exemple, il y a une méthode de mise à jour de statut dans mon contrôleur, que je pourrais écrire quelque chose comme ceci :

public ActionResult UpdateStatus(int id, Status status)
{
    Orders order = _orders.GetById(id);
    order.Status = status;

    if (status = Status.AwaitingApproval)
    {
        SendAwaitingApprovalNotification(_roles.GetApproverForDept(order.Department));
    }

    else if (status = Status.Approved && order.Department = someDept) { ... }

    else if (status = Status.Approved && order.Department = someOtherDept) { ... }

    else if // ... etc
}

Comme vous pouvez le voir, tout cela va devenir vite compliqué. Et aussi, la logique pour quand/quelles notifications sont envoyées est codée dans le contrôleur, ce qui ne me semble pas correct.

De plus, il y a diverses autres actions qui peuvent changer l'état sans appeler spécifiquement la méthode UpdateStatus. par exemple

public ActionResult ChangeOrderCost(int id, decimal newCost)
{
    Orders order = _orders.GetById(id);
    order.Cost = newCost;
    order.Status = Status.AwaitingCustomerApproval;
}

Ce ne sont que des exemples inventés mais j'espère que vous comprenez l'idée.

En réalité, je pense que toutes mes règles de notification devraient être autonomes dans une sorte de classe de notification configurable, qui surveille essentiellement les changements d'état sur mon objet et fait ce qu'il faut, agissant donc comme un plugin pour l'application principale et maintenant un couplage lâche. En même temps, je ne pense pas vraiment que mes objets de données sous-jacents devraient dépendre de choses comme les services de notification, je pense que cela devrait se brancher sur mes classes de contrôleur principales.

Je ne peux pas vraiment penser à comment réaliser cela, mais je suppose que c'est un problème courant. Y a-t-il un motif de conception spécifique sur lequel je peux lire pour avoir des indices ? Est-ce que quelqu'un a déjà fait quelque chose comme ça auparavant ? Est-ce que je pense même correctement à ce problème ? Je suis assez nouveau dans tout ça mais j'essaie de penser et coder correctement.

2voto

Aliostad Points 47792

Je conseillerais le modèle Chain-Of-Responsibility : http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

C'est essentiellement une chaîne dans laquelle chaque élément agit / n'agit pas en fonction de la condition de test implémentée par lui. Ces conditions peuvent être rendues configurables mais cela dépend de votre implémentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X