2010-08-26 3 views
0

Je suis nouveau sur ASP.NET MVC et j'essaie d'implémenter les meilleures pratiques pour une application de petite à moyenne taille qui utilise un service Web comme source de données. Le service Web expose les méthodes suivantes pour soutenir l'application:Modèle de référentiel MVC/Services Web SoC Question

  1. AuthenticateCustomer - renvoie l'ID client si e-mail valide/mot de passe
  2. GetCustomer - retourne un objet sérialisé contenant des informations client
  3. Etc

Ma question est, tous ces services retournent des valeurs de succès (bool) et de message (chaîne) selon le résultat de l'opération. Le message contient des informations descriptives si une erreur s'est produite. Je ne suis pas sûr si l'appel des services Web appartient à la couche Repository, mais je pense qu'il est important de pouvoir transmettre les valeurs Success et Message via les couches Repository -> Service -> Controller. La seule façon que je peux penser à faire est soit jonchant les méthodes du référentiel avec sur les arguments:

public int AuthenticateCustomer(string Email, string Password, out bool Success, out bool Message); 

ou créer une sorte d'enveloppe qui contient la valeur de retour prévue (entier) et le succès et les valeurs de message. Cependant, chaque méthode de service Web renvoie des valeurs différentes, de sorte qu'un wrapper de taille unique ne fonctionnerait pas. En outre, ces valeurs devraient être transmises à travers la couche Service, et il semble que la validation de quelque sorte se passe au niveau du Repository. 1. Séparation des problèmes (validation, accès aux données via le service Web) pendant que ... le chemin de la vue?

P.S. - Désolé pour la question laconique. C'est un peu difficile à expliquer avec n'importe quelle sorte de brièveté.

Répondre

0

Avez-vous besoin d'un référentiel? D'après ce que vous avez décrit, je considère le service Web comme le référentiel. J'utiliserais ensuite les Services (Business Layer) pour appeler le Web Service, et la logique de traitement des erreurs ou du succès. Demandez au Business Layer de convertir l'objet Customer du service Web en objet métier et de le transmettre aux contrôleurs.

référentiel (Services Web) -> Services (Layer Business) -> couche de présentation (contrôleurs)

+0

Martin, Votre réponse est logique. En y réfléchissant, mon application ne «possède» pas les données et n'est pas responsable de la conservation des données dans le stockage persistant (le service web gère cela), éliminant ainsi le besoin d'un référentiel explicite. Merci de votre participation. – Ariel

0

La réponse de Martin est bon.

Je pourrais éventuellement voir un cas pour une couche mince autour des services Web pour faciliter les tests.

Si vous faites cette route et que Success = false n'est pas une condition courante, vous pouvez lancer une exception de votre propre type avec le succès et le message enveloppés dedans. Je ferais seulement ceci si c'était vraiment une condition exceptionnelle. Si vous trouvez votre couche de gestion intercepter l'exception juste pour retourner un code d'erreur à la couche de présentation, alors c'est la mauvaise approche.

+0

Rob, C'est le problème que j'ai rencontré en concevant ceci. Je suis en mesure d'effectuer une validation sur la couche de service, mais il existe des règles métier intégrées au service Web que je suis incapable de gérer dans ma couche de gestion. Par exemple, il existe un service permettant au client de changer son identifiant (email). Le service Web valide que le nouveau login n'est pas déjà utilisé par un autre client. Il est important que cette rétroaction soit capturée par la couche de service, puis présentée à l'utilisateur. Il "se sent" très mal, mais j'ai du mal à trouver une meilleure façon de le gérer. – Ariel

Questions connexes