2008-12-27 11 views
4

Est-il acceptable, dans la pratique, d'utiliser la deuxième couche pour rediriger l'utilisateur?Application Web à trois couches

Par exemple:

public static void ForceLogin() 
{ 
    HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieName]; 

    if (cookie != null) 
    { 
     if (Regex.IsMatch(cookie.Value, "^[0-9]+\\.[a-f0-9]+$")) 
     { 
      using (EibxDataContext db = new EibxDataContext()) 
      { 
       int count = db.Logins.Count(l => l.Password == cookie.Value); 

       if (count == 1) 
       { 
        return; 
       } 
      } 
     } 
    } 

    HttpContext.Current.Response.Redirect("~/Login.aspx"); 
} 

A la dernière ligne, j'utilise la couche logique d'entreprise/de service pour rediriger l'utilisateur vers la page de connexion.

Est-ce que cela doit être fait dans la couche Présentation?

Répondre

8

Absolument pas. La couche logique métier doit prendre la décision, la couche UI doit effectuer la redirection. La couche de gestion ne doit rien savoir de HttpContext et ne devrait pas lire directement les cookies. Transmettez les informations pertinentes dans la couche de gestion afin que la couche de gestion puisse prendre la décision et transmettez la décision à la couche d'interface utilisateur pour qu'elle puisse travailler sur la décision résultante.

Voici la raison ... que se passe-t-il si la couche de gestion est utilisée à partir d'un service Web? Comment la couche métier peut-elle effectuer une redirection dans cette instance? Ou supposons qu'il est utilisé avec un client non-web? La redirection n'a aucune signification dans ce contexte. Si vous modifiez votre couche d'interface utilisateur, cela ne devrait pas affecter votre couche de logique applicative, et le mélange des redirections et la lecture des cookies dans la couche de gestion nécessiteront cela avec la conception proposée.

+0

Merci pour les réponses. J'ai préféré cette réponse à cause de la dernière section, qui a éclairci les choses pour moi. Je vous remercie. –

0

Je dirais que vous avez raison de le faire dans la logique métier. La couche de présentation ne devrait pas prendre de décisions concernant le routage.

+1

Peut-être pas "présentation", mais redirection/routage est toujours un problème "interface utilisateur", pas nécessairement le travail de votre code de service. Pourquoi cela devrait-il être au courant du serveur Web? –

+0

D'accord avec Marc. Pas downvoting (évidemment l'OP a aimé cette réponse), mais je ne voudrais jamais aucun niveau autre que des redirections de gestion de présentation. C'est un concept entièrement d'assurance-chômage. Demandez à la couche de gestion de retourner la connexion qui a échoué et laissez l'interface utilisateur déterminer ce qu'elle doit faire. –

+0

Le contrôleur Web fait partie de la vue dans ce cas. Vous pensez à quelque chose que j'appellerais la couche de service. Le contrôleur qui accepte les demandes, les itinéraires vers les services et les redirections vers la vue appropriée est écrit et déployé avec le client. – duffymo

5

Cela dépend de la façon dont vous définissez vos calques; par exemple, ma «logique métier» est généralement liée au problème que j'essaie de résoudre et ne sait rien de l'interface utilisateur. Il ne peut donc pas effectuer de redirection, car il n'a pas accès à la demande/réponse. Personnellement, je ferais cela à la couche d'interface utilisateur; Traiter les interactions brutes telles que le rôle de gardien et de gardien fait partie du travail de la couche d'interface utilisateur pour une application Web. OMI. Par exemple, via un module http, qui est (par définition) un composant au niveau de l'interface utilisateur.

Questions connexes