Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OnAfterCreateAsync sur les Collections #286

Open
thomaf opened this issue Nov 28, 2018 · 7 comments
Open

OnAfterCreateAsync sur les Collections #286

thomaf opened this issue Nov 28, 2018 · 7 comments

Comments

@thomaf
Copy link

thomaf commented Nov 28, 2018

On a le besoin dans le cas où on notifie RabbitMq lors de la création d'une entité.
Si on fait cette notification directement dans le CreateAsync, on a des cas où le message est traité avant que l'entité ne soit créée en base.

@nfaugout-lucca
Copy link
Contributor

Il faut plutôt faire ça dans l'AppController que sur la collection, car comme tu dis la collection est agnostic du SaveChanges là où c'est l'AppController qui le provoque.

@Poltuu a dû faire ce genre de séquençage dans l'AppController sur PTalent, pour les notifs par mail notamment. C'est le même genre d'idée.

@Poltuu
Copy link
Contributor

Poltuu commented Nov 28, 2018

je confirme ce que @nfaugout a dit, c'est une problématique de synchronisation, qui a lieu au niveau applicatif.
Il faut overrider un XXXAppController, la méthode .Create
Tu auras accès au
await _unitOfWork.SaveChangesAsync();
et donc tu pourras mettre ton code au bon endroit (en dessous)

Mais u simple override, avec ajout de code à la suite de la méthode de base devrait faire l'affaire je pense

@rducom
Copy link
Contributor

rducom commented Nov 28, 2018

Sinon tu peux implémenter un IOnSaveChangesHookAsync<T> qui sera appelé après chaque sauvegarde d'une entité

https://github.com/LuccaSA/RestDrivenDomain/blob/master/src/Rdd.Infra/Storage/IOnSaveChangesAsync.cs

@nfaugout-lucca
Copy link
Contributor

@thomaf la solution via AppController c'est la solution "fonctionnelle", où tu sais dans quel contexte tu te situes. La solution de @rducom c'est une solution "technique" qui va jouer qq soit le contexte qui a provoqué un SaveChanges, à toi de voir dans quel cas tu te trouves, mais je pense que si y'a du RMQ derrière tu dois être sur du fonctionnel.

@thomaf
Copy link
Author

thomaf commented Nov 28, 2018

Dans mon processus métier, la création d'une ReportRequest implique la publication d'une notification au RemotTaskPublisher.
Je m'attends donc à trouver ce code dans mon domaine.
Le principe du OnAfterCreateAsync est bien d'être agnostique de l'enregistrement au même titre que le OnAfterUpdateEntity.
Après, je ne suis pas sûr de bien saisir la répartition des rôles entre le domaine et l'application.

@rducom
Copy link
Contributor

rducom commented Nov 28, 2018

Avec IOnSaveChangesHookAsync<T> tu aura la liste des entités T modifiées, crées, et supprimées pour n'importe quel appel à SaveChanges. Donc comme dit nico, si systématiquement pour T tu veux faire un truc, alors IOnSaveChangesHookAsync<T> est fait pour toi.

Si par contre, sur certaines méthodes tu veux faire un truc lors d'un crud sur T, et dans d'autres non, alors il faut implémenter toi même ces traitements.

@nfaugout-lucca
Copy link
Contributor

Ici il faut imaginer que l'AppController fait partie de ton Domain.

Le Domain (au sens du projet Domain) ne décide pas quand il peut commiter en base, c'est un choix qu'on a fait. Peut-être à remettre en cause dans une discussion séparée...

Ici c'est un peu la même chose, ce n'est pas le Domain qui peut décider de lever un événement vers le monde extérieur, c'est la responsabilité du AppController au même titre que le commit en base.

Donc ton appController va orchestrer le processus :

  • demande au Domain de créer l'entité
  • commit en base
  • publier un message vers ton publisher, voire déléguer ça au domain, càd appeler une méthode du domain qui publie, ainsi TOUT le code est bien dans le domain, seul l'ordonnancement est délégué à l'appController.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants