2015-03-23 1 views
0

Je suis nouveau chez Domain Driven et CQRS et je suis un peu confus au sujet du mécanisme du gestionnaire d'événements.Événement de changement de base de données et de gestionnaire d'événements de domaine

Des événements Domian déclenchent un événement. Par exemple un compte créé.

public class Account: AggregateRoot{   
     public Account(Guid id) 
     { 
      Apply(new AccountCreatedEvent { AggregateRootId = id }); 
     } 
} 
public class AccountCratedEvent: DomainEvent{ 
} 

Je pense qu'il s'agit d'un mécanisme d'événement interne pour Domain. Donc je ne peux pas envoyer un email au nouveau propriétaire du compte. Parce que le nouveau compte n'a pas encore été enregistré dans la base de données. Alors devrais-je créer un nouveau gestionnaire d'événements à remplir après les économies de la base de données?

+0

duplication possible de [Persistance et événements de domaine avec persistance objets ignorants] (http://stackoverflow.com/questions/22194403/persistence-and-domain-events-with-persistence-ignorant-objects) –

Répondre

0

Oui, c'est une question fréquente. En fonction de la nature exacte de votre domaine, vous pouvez choisir l'un des 2 emplacements possibles pour envoyer des e-mails à partir de:

L'emplacement le plus simple est celui d'un gestionnaire d'événements. Cela suppose un certain nombre de choses:

  • Peu importe si tous les gestionnaires d'événements complets
  • avec succès L'événement et le modèle ou lire a toutes les informations nécessaires pour envoyer le message. Fait important, le modèle de lecture ne dépend pas de l'achèvement des mises à jour (problème de cohérence éventuel).
  • Votre message est simple envoi d'infrastructure

Si l'une de ces choses sont un problème, vous devez utiliser un gestionnaire de processus. C'est un périphérique qui peut écouter des événements et émettre des commandes. Dans ce cas, à la fin de tous les événements, émettez une commande pour envoyer un courrier électronique.

J'ai écrit un article de blog plus détaillé sur ce sujet. Vous pouvez le lire ici: How to Send Emails the Right Way in a CQRS System

+0

Vos commentaires de blog sont fermé, et je pense que vous le faites mal ;-) Pourquoi pensez-vous que les événements et les commandes sont au même niveau ?, mais en fonction de certains mots-clés magiques, il déclenchera un événement ou appellera une commande. – Janus007

+0

Je ne suis pas certain de comprendre votre point de vue. Dans une configuration CQRS ES, une commande représente une action. Un événement est quelque chose qui représente un changement d'état. Je ne suis pas sûr de ce que je comprends le bit 'même niveau'. Peux-tu élaborer. – Codescribler

+0

Salut CodeScribler J'ai lu votre blog à nouveau et il semble que j'ai sauté sur le ProcessManager, mes excuses pour cela .. Je suis d'accord avec votre logique, certainement le ProcessManager pourrait être écrit plus élégant sans casser ouvertement mais c'est une autre histoire. cont. – Janus007

0

Appliquer() un événement ne correspond pas à l'envoyer immédiatement bien que votre modèle de domaine gérer les événements tout de suite comme:

public class Account: AggregateRoot{   
    public Account(Guid id) 
    { 
     Apply(new AccountCreatedEvent { AggregateRootId = id }); 
    } 
    public void handle(AccountCreatedEvent event) 
    { 
     this.id = event.AggregateRootId 
     this.status = "New" 
    } 
} 

La mise en œuvre Appliquer() habituellement il suffit de gérer l'événement sur l'agrégat lui-même et mettre en cache les événements déclenchés. D'autres objets, généralement Repository, sont chargés d'obtenir les événements mis en cache et de les émettre.

+0

est l'événement créé par compte un événement de domaine lui-même? Je peux envoyer un email après avoir sauvegardé la base de données. – barteloma

+0

Non, AccountCreatedEvent n'est pas un événement "interne" selon votre définition. C'est un événement qui peut être publié. Mais la publication ne se produit pas immédiatement lorsque Apply() est exécuté, à la place, L'implémentation de Apply() met généralement en cache les événements dans une unité de travail. L'événement doit être publié après l'engagement de l'unité ou du travail. – Hippoom