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.