Question

Mon équipe de développement se heurte à un problème de conception. J'espère que quelqu'un peut me aider à nettoyer cette partie de l'architecture un peu.

Dans mon système, j'ai un ENUM avec 250 membres [un membre représente une nette baisse vers le bas]. Pour remplir les bas de déposer dans une fenêtre donnée, cette forme envoie dans les membres enum qui se rapportent aux bas de chute nécessaires, et le menu déroulant des informations est renvoyée.

En d'autres termes, disons par exemple, nous avons 3 fenêtres. Fenêtre A a les menus déroulants X, Y et Z. fenêtre B a les menus déroulants W, X et Y et la fenêtre C a menus déroulants T, U et W. Ma DropDownType enum consisterait à T, U, W, X, Y, Y et Z. donc, pour une fenêtre spécifiée, étant donné les bas de chute sur cette fenêtre, je requête pour que les données apparaissent dans les menus déroulants.

Ceci est un exemple simplifié parce que mon application se compose de> 250 menus déroulants distincts.

Comme vous pouvez l'imaginer, j'ai une configuration d'usine pour renvoyer les données pour chaque menu déroulant. Et cette usine est appelée pour chaque menu déroulant demandé.

    switch (dropDownType)
    {
        case DropDownType.T:
            return (from t in dataContext.GetTable<TableOne>() 
                    select new DropDownDto 
                               { 
                                   DropDownDisplayName = t.ColumnA,
                                   DropDownValue = t.ColumnB
                               }).ToList();
        case DropDownType.U:
            return (from u in dataContext.GetTable<TableTwo>() 
                    select new DropDownDto 
                               { 
                                   DropDownDisplayName = u.ColumnC,
                                   DropDownValue = u.ColumnD
                               }).ToList();
        // etc...
    }

Depuis que j'ai tant de membres dans cette ENUM, personne ne sait d'une façon plus élégante de coder cela? Pensez-vous que transformez cela en méthodes d'usine serait utile (mais nous avions à vous soucier de 250 fichiers séparés dans notre source ...)? Y at-il un autre motif là-bas qui est plus utile? Le fait d'avoir cette instruction switch énorme devient ingérable.

Toute aide est grandement appréciée. Merci d'avance!

Était-ce utile?

La solution

Vous pouvez créer un à chaque entrée Dictionary<DropDownType, DropDownDtoDelegate> contenant une entrée de ENUM comme une clé et un délégué pour récupérer la liste déroulante des données comme la valeur. Cela vous permettra de garder chaque méthode qui retourne une liste déroulante séparée et de la déclaration énorme de l'interrupteur. Vous auriez alors une méthode pour récupérer le délégué, l'exécuter, et retourner le menu déroulant des données de la liste.

Autres conseils

Il existe des solutions à ces problèmes.

  1. Vous pouvez utiliser un dictionnaire à la carte des bas de baisse à vos données.

  2. Vous pouvez même envisager de déplacer ces données cartographiques dans la base de données. La quantité de données peut justfy cette décision.

  3. Pour supprimer les clés supplémentaires sous forme de votre ENUM pensez à utiliser les noms des listes déroulantes comme la clé.

Voici un blog vraiment bon traitant des questions et de proposer des solutions similaires.

Back to Basics - La vie après Si, pour et Switch - Comme, un Structures de données Rappel

Une option pourrait consister à utiliser la réflexion pour gérer la valeur ENUM. Si vous avez une norme de dénomination cohérente pour toutes les classes concernées, il pourrait y avoir un moyen de générer dynamiquement le nom de la table / collection pour interroger et le nom du DTO pour revenir. Il faudra un peu de code « frais généraux » pour le faire fonctionner, mais une fois que vous le faites, cela pourrait fonctionner pour toutes les différentes tables.

J'utiliser DynamicMethod pour générer du code dans l'exécution pour chaque élément dans le ENUM. Cela devrait être mis en mémoire cache dans un dictionnaire, et généré sur la demande.

Avec un attribut, vous pouvez définir l'entité utilisée sur chaque ENUM, et ces 2 propriétés nécessaires.

Je peux imaginer quelque chose comme ça.

enum DropDownType
{
   [Configuration(Type = typeof(TableOne), DisplayNameProperty = "ColumnA", ValueProperty = "ColumnB")]
   T,

   [Configuration(Type = typeof(TableTwo), DisplayNameProperty = "ColumnC", ValueProperty = "ColumnD")]
   U
}

Lorsque vous avez une valeur ENUM, vous vérifiez le dictionnaire pour la méthode en cache, sinon présent, vous générez.

En utilisant la réflexion que vous obtenez les infos de propriété, et avec un peu d'habileté IL, cela peut être fait facilement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top