2009-01-07 10 views
1

Je me bats un peu pour comprendre cela.LINQ to SQL, Generalization

Je travaille sur un projet ASP.NET MVC, en utilisant LINQ to SQL pour ma couche de données. La base de données se compose d'une dizaine de tables "d'exceptions" différentes, par ex. "Exceptions.LADM", "Exceptions.USB", "Exceptions.GPO". Fondamentalement, ces tables suivent les informations utilisateur + machine pour la relaxation de diverses procédures de sécurité.

Mon modèle LINQ to SQL a été généré. J'ai différentes classes pour chaque table à ma disposition. Cependant, je ne suis pas sûr de savoir comment les utiliser dans le contrôleur sans avoir à générer des actions de contrôleur distinctes pour chaque type d'exception. Pour une action List, je veux faire quelque chose comme ceci:

// Example Request: /Exceptions/List/ladm 
// Routing: Controller = "Exceptions", Action = "List", type = "ladm" 

// Controller Action: 

public ActionResult List(string type) 
{ 
    string viewname = "List-" + type; // refer to "List-ladm" view. 
    if(type == "ladm") 
    { 
     var items = _repository.ListAllLADMExceptions(); 
    } 

    return View(viewname, items); 
} 

Mon référentiel implémente ListAll<XXXXXX>Exceptions méthodes pour chaque table. Existe-t-il un moyen d'éviter 10 différentes instructions if/else? Ça a l'air moche et je suis sûr qu'il y a une meilleure façon à laquelle je ne peux pas penser. Peut-être que je l'approche d'un angle incorrect.

Toutes les suggestions seraient les bienvenues.

Merci.

Répondre

1

Vous pouvez essayer de dispatching méthode dynamique en utilisant la réflexion (il est assez coûteux, sage-performance):

object items = _repository.GetType().GetMethod("ListAll"+type+"Exceptions") 
          .Invoke(_repository, null); 

J'écrirait une déclaration switch (non if/else) pour 10 cas cependant. C'est pas si mal.

switch (type) { 
    case "ladm": return View("ladm", _repository.ListAllLADMExceptions()); 
    case "....": return View(....); 
} 
+0

Ceci est un de ces cas cependant, où cette performance n'est pas si mauvaise - vous faites 1 appel de réflexion et un tas d'E/S réseau (gestion de la requête). Le réseau IO est votre partie lente, pas la réflexion. Peut-être que si vous faisiez des centaines d'appels de réflexion pour chaque demande, vous vous en soucieriez. –

+0

L'accepter comme une réflexion finale semble mieux correspondre à ce scénario. Je vais comparer et voir combien il est cher comparé à if/else ou case/switch. Merci. – Nasir

2

Le modèle typique est un contrôleur par table. Que diriez-vous de repartitionner la variabilité en plusieurs classes de contrôleurs en utilisant une classe de base commune? Quelque chose comme ça:

public abstract class ExceptionsBaseController<T> : Controller where T:class 
{ 
    protected abstract Table<T> ExceptionsTable { get; } 

    public virtual ActionResult List() 
    { 
     var items = ExceptionsTable; 
     return View(items); 
    } 
} 

Un avantage comme je le vois serait plus facile de gérer les différences entre les classes d'exception et d'en ajouter de nouvelles. Cela n'aidera probablement pas votre nombre total de lignes de code, mais peut-être qu'il peut éveiller des idées.