2017-08-16 1 views
0

J'écris une application où lors de la création de compte utilisateur, je veux une série d'événements à se produire - envoyer un cadeau, envoyer un e-mail, etc. Ma question est de quelle façon avez-vous abordé problème comme cela structurellement, l'injection de dépendance ?, les observateurs? Ou avez-vous créé une méthode qui gérerait tous ces événements? Nous avons un service d'enregistrement d'utilisateurs, mais je crains que plus nous ajouterons d'événements, plus nous aurons de dépendances aléatoires.OOP architecte une série d'événements lors de la création de l'utilisateur

+0

** Observers **: non, ils sont déconseillés et il est difficile de savoir si un objet est observé. ** Service d'enregistrement ** (objet de service): définitivement! Si vous avez ce motif, vous pouvez simplement créer d'autres objets de service qui seront appelés dans ce service d'enregistrement (ex: dans 'RegistrationService # perform' vous pouvez appeler' UserRegistration :: SendWelcomeEmail.new (self.user) .perform si self. user.allow_email_reception? ') – MrYoshiji

Répondre

0

Cela ressemble à une bonne situation pour utiliser ActiveRecord Callbacks

URL: http://guides.rubyonrails.org/active_record_callbacks.html

je lirais que décider quel rappel correspond à votre situation et faire une préoccupation qui contient toutes les « série d'événements » qui vous voulez se produire. En outre, inclure cette préoccupation sur le modèle qui en a besoin.

J'espère que ça aide!

+0

Il n'est pas toujours souhaitable d'exécuter le rappel à chaque fois que l'utilisateur est créé. Il existe des situations où la création d'enregistrements de base de données n'est pas égale à l'enregistrement. Par exemple dans les tests unitaires. Il est donc préférable de séparer les manipulations de base de données (dans l'enregistrement actif) et la logique métier. –

+0

Appréciez l'entrée. –

2

Pour l'enregistrement de l'utilisateur, il est utile de publier un événement de domaine devant être géré par différents sous-systèmes. Ainsi, vos objets sont complètement découplés. Mais l'architecture événementielle a son prix - il est beaucoup plus difficile de déboguer et de comprendre et nécessite une certaine discipline.

Si le découplage n'est pas un objectif, vous pouvez utiliser modèle de décorateur en enveloppant votre service avec un comportement supplémentaire:

registration_service = WellconeNotification.new(UserRegistration.new) 
registration_service.call(params) 

L'idée clé ici est de séparer les dépendances et les paramètres. J'ai trouvé très pratique d'utiliser le constructeur pour les dépendances et les arguments de la méthode pour les paramètres.

Cette approche implique une gestion des dépendances un peu plus difficile et un type de localisateur de service. Je recommande d'examiner les gemmes dry-container et dry-auto_inject.

L'écriture de tout le code dans un objet de service peut être une première étape raisonnable si vous n'avez pas beaucoup de logique métier ou si vous n'avez pas encore de besoins de collecte.