2009-01-27 7 views
0

Je travaille sur une application Web qui modifie un document XML stocké dans une base de données. Il est fait pour imiter exactement comme n'importe quel programme lorsque vous cliquez sur l'option "préférences" dans le menu. Le document XML est lu par une application client locale et toutes les modifications sont répercutées dans le client local. Je suppose que vous diriez que la page aspx est la «vue», une couche de service où je valide/traite toutes les entrées utilisateur, et une couche de données où je mets à jour le document XML.Performances de Linq to Objects et meilleure implémentation

Pour chaque page de paramètres, j'avais parcouru récursivement tous les contrôles de la page et si j'en avais un sur lequel je voulais travailler (case à cocher, zone de texte, ...) je l'ai ajouté à un IList puis J'ai envoyé IList à la couche de service où j'ai dû retirer le contrôle de la liste pour pouvoir travailler dessus. J'ai remarqué que cela semblait être un peu lent donc j'ai profilé la page et, fondamentalement, les requêtes LINQ to Objects que j'utilisais ont tendance à consommer beaucoup de temps.

(CheckBox)lstControls.Where(x => x.ID == "some_id").SingleOrDefault(); 

je puis passer à ajouter manuellement les commandes de la page à un IList puis en les tirant dans la couche de service par indexeur dans l'ordre où ils ont été mis en. Ceci est fugly et dépend entièrement de vous pas visser l'index du contrôle que vous recherchez. Enfin, cela casse la règle consistant à mélanger des éléments de la vue avec la couche de service ou la couche de données. Je sais que je ne devrais travailler qu'avec des données, mais je ne sais pas comment le faire efficacement.

Chaque page de paramètres comporte entre une et trente commandes à traiter. Comment puis-je obtenir toutes les données des contrôles à la couche de service sans envoyer les contrôles réels?

Merci pour l'aide ....

+1

Que l'on en particulier pourrait être améliorée de la manière suivante: (CheckBox) lstControls.SingleOrDefault (x => x.ID == « some_id ») – mquander

+0

Vous pouvez utiliser un Dictionary pour les contrôles au lieu d'une liste. Ensuite, leur accès serait O (1) au lieu de O (n). – configurator

Répondre

1

Vous pourriez entrer dans une meilleure situation si vous réunissez les données, les choses que vous êtes réellement intéressé, dans une structure de l'objet avec une sémantique qui vous aidera à structurer ce est transmis à la couche suivante. Le mot clé "Databinding" devrait également vous aider à accéder aux valeurs saisies. Il n'y a pas besoin de passer tous les contrôles à la prochaine couche ..

+0

C'est ce que je cherche à faire, mais il y a plus de 40 pages. Puisque chaque page est différente, est-ce que je devrais faire un objet séparé pour chaque page ou peut-être faire l'objet de dictionnaire pour passer les données entre les couches? –

+0

À vous de voir. Les objets explicites sont beaucoup plus expressifs qu'un dictionnaire. Un tel objet de transfert de données peut être construit très simple, par ex. classe FooSettings { bool CanDoCette {get; ensemble; } chaîne ChoseThat {get; ensemble; } } – flq

Questions connexes