2009-10-20 2 views
1

Il existe deux classes dans mon projet (utilisant ASP.NET MVC): AuthenticationService et ProfileService. Lorsqu'un nouvel utilisateur s'inscrit sur mon site, l'action Enregistrer du contrôleur d'authentification appelle une méthode Register dans IAuthenticationService, qui crée un enregistrement d'authentification pour l'utilisateur selon le module d'authentification concret auquel l'interface fait référence (injecté dans le constructeur du contrôleur). Dans le cadre du processus d'enregistrement, un enregistrement de profil est créé pour l'utilisateur. Il est créé en appelant CreateProfile (User) sur le service IProfileService injecté. À l'heure actuelle, le contrôleur appelle les deux services, mais j'aime l'idée que mon contrôleur fonctionne aussi peu que possible. Je me demande si j'ai d'autres options que de laisser le service d'authentification connaître le service de profil, ce qui nécessitera à son tour l'implémentation future de IAuthenticationService pour savoir comment appeler CreateProfile? Je ne peux pas m'empêcher de sentir que l'odeur du code est écrite partout.Un service doit-il être référé à un autre ou l'appelant doit-il prendre une responsabilité supplémentaire?

Une autre possibilité est d'avoir un troisième service, {I,} RegistrationService, responsable de la logique.

Quelle est la manière recommandée ou préférée de gérer cette situation? Merci

Répondre

0

J'aime la troisième approche. J'ai une situation similaire dans mon application où le contrôleur a besoin de plusieurs services au niveau du domaine pour effectuer une tâche, et le code devient un peu verbeux pour un contrôleur. En particulier, j'ai un système de gestion d'événements qui permet des téléchargements de photos. En plus des dépôts et IAuthService, le stockage physique est géré par un IFileSystem (nous pouvons basculer entre local et S3), la manipulation d'image par IThumbnailer, le balayage/nettoyage géré par un IBackgroundTask.

Ce que j'ai commencé à faire est de créer des services d'application en plus des services de domaine pour assumer la responsabilité, de sorte que le conteneur est maintenant seulement principalement injecté des services d'application (option 3 dans votre cas)

+0

Je pense que c'est ce que je vais faire, extraire le processus d'enregistrement dans un service distinct ({I} RegistrationService). Cela semble juste plus propre. Merci. –

0

J'irais avec un {I} RegistrationService qui dépend des services IAuthenticationService et IProfile.

En règle générale, je cherche à avoir une seule dépendance de service par contrôleur

0

Si le contrôleur est chargé de l'enregistrement des utilisateurs et la création de profils, ce qui est la question? C'est bon pour un contrôleur d'appeler plusieurs services. Le contrôleur sert un but et il ne doit pas être follement granulaire.

La création d'un troisième contrôleur pour l'enregistrement général utilisant une référence d'interface à l'authentification et au profil serait probablement la meilleure solution. Ensuite, l'authentification et les profils ne sont pas couplés.

Questions connexes