2009-08-03 4 views
3

Ich habe ein Attribut-Controller namens [RequiresCompletedProfile], dass ich auf Action-Methoden setzen kann aus geht es um einen Benutzer zu verbieten, es sei denn, sie ihr Profil abgeschlossen haben.Ist es eine schlechte Übung, mehrere separate Datenbankaufrufe von der ASP.NET MVC-Webanwendung aus durchzuführen?

Das funktionierte gut, als ich eine Art von Benutzer hatte, aber die App hat sich seitdem in zwei Arten von Benutzern entwickelt: Anbieter und Clients.

So gibt es nicht mehr ein „User_Profile“ -Tabelle. Es gibt jetzt ein "Client_Profile" und ein "Vendor_Profile" und ihre Schemas sind unterschiedlich. Ich sollte beachten, dass ich LINQ verwende, aber ich alle LINQ-Objekte zu POCO zuordnen, bevor Sie sie zurückgeben.

war meine Lösung eine Schnittstelle namens „User_Type“ zu machen, dass die folgende Methode hatte:

bool IsProfileCompleted(); 

Nun meine Client-Objekte und meine Vendor-Objekte können sowohl die Schnittstelle implementieren und zu bestimmen, ob ihre Felder verantwortlich/Mitglieder stellen ihr Profil fertig.

Aber jetzt, dass ich mehrere Benutzertypen haben, kann ich nicht sicher sein, welche Tabelle das Profil von ziehen, so habe ich so etwas wie dies zu tun:

public class RequiresCompleteProfileAttribute : ActionFilterAttribute 
{ 
    IUserRepository userRepo = new SqlUserRepository(); 
    IClientProfileRepository clientProfileRepo = new SqlClientProfileRepo(); 
    IVendorProfileRepository vendorProfileRepo = new SqlVendorProfileRepo(); 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 

      // Database call #1 
      var user = userRepo.GetUserByUsername(User.Identity.Name); 

      UserType profile; 

      if (user.UserTypeName == "Client") 
      { 
      // Database call #2 
      profile = clientProfileRepo.GetClientByUserName(filterContext.HttpContext.User.Identity.Name); 

      } 
      else 
      { 
      // Database call #2 
      profile = vendorProfileRepo.GetClientByUserName(filterContext.HttpContext.User.Identity.Name); 
      } 

      if (!profile.IsProfileCompleted()) 
       filterContext.HttpContext.Response.Redirect("/admin/editprofile/"); 


     } 

     base.OnActionExecuting(filterContext); 
    } 

} 

Sie können hier sehen, dass ich müssen 2 Datenbankaufrufe tätigen, einen um den Typ des Benutzers zu ermitteln, und den anderen, um das Profil von der entsprechenden Tabelle zu erhalten.

Ist das eine schlechte Übung? Wenn ja, was sollte ich stattdessen tun?

Antwort

4

Es ist nicht gerade eine schlechte Übung, aber Sie wären gut bedient, wenn Sie ein Geschäftsobjekt der mittleren Ebene haben, das die Logik der Abfrage des Clients nach Benutzername auf der Basis des Benutzernamens einbezieht.

+0

@McWafflestix, können Sie ein wenig näher erläutern? Ich sollte eine Serviceklasse erstellen, die genau das tut? – FalconKick

Verwandte Themen