2010-11-11 19 views
1

Ok, j'ai un projet C# nommé BusinessLayer qui produit un assembly appelé BusinessLayer et l'espace de noms est BusinessLayer.Silly Namespace Question

À l'intérieur de ce projet, j'utilise des dossiers pour stocker du code. Un dossier s'appelle FilterElements et il a des dossiers appelés FilterKeyReversal, FilterRandom et FilterToday. Prenons l'exemple du dossier FilterRandom. Il a une classe appelée LessThan10DaysGreaterThan50A avec un espace de noms de BusinessLayer.FilterElements.FilterRandom et une seule méthode statique publique appelée RunFilter();

Dans le code derrière la page du site Web qui utilise cette méthode, j'ai l'instruction using, Using BusinessLayer. J'ai également une autre instruction utilisant, en utilisant BusinessLayer.FilterElements.

Je pense que pour exposer la méthode RunFilter() de la classe LessThan10DaysGreaterThan50A, je pourrais utiliser la syntaxe suivante: FilterRandom.LessThan10DaysGreaterThan50A.RunFilter(), mais je reçois l'erreur suivante: Le nom FilterRandom n'existe pas dans la contexte actuel.

Si j'utilise la ligne de syntaxe suivante, l'erreur disparaît: BusinessLayer.FilterElements.FilterRandom.LessThan10DaysGreaterThan50A.RunFilter(), ou si j'utilise une instruction à l'aide de: Utilisation BusinessLayer.FilterElements.FilterRandom, la syntaxe suivante fonctionne: LessThan10DaysGreaterThan50A.RunFilter().

Je préfère utiliser FilterRandom.LessThan10DaysGreaterThan50A.RunFilter() car il semble rendre le code plus lisible. Si j'utilise un alias avec la syntaxe suivante d'utilisation de FilterRandom = BusinessLayer.FilterElements.FilterRandom, je peux obtenir ce que je veux, mais je n'aime pas vraiment l'idée d'utiliser un alias car cela peut mener à la confusion sur toute la ligne. Je pensais que puisque mon espace de noms BusinessLayer avait des espaces de noms imbriqués, je serais capable de récupérer l'espace de noms restant, mais je n'arrive pas à le faire fonctionner. Quelqu'un sait comment faire ce travail sans utiliser d'alias, ou vais-je devoir utiliser le nom entier de l'espace de noms à chaque fois?

Merci.

+2

Cela fonctionne en VB.NET, mais pas en C#. L'alias est tout ce que tu as. –

+0

J'ai deuxième @Hans - couru dans ce numéro l'autre jour, moi-même. Incidemment, pourquoi une classe qui est verrouillée à une règle métier très spécifique (moins de 10 jours, etc.) au lieu de simplement implémenter un filtre qui peut fonctionner sur une plage de dates arbitraire? –

+0

Que diriez-vous d'une classe interne imbriquée au lieu d'un espace de noms? Ou Quelque chose comme FilterRandom.FilterLessThan10DaysGraterThan50A() à la place. – mellamokb

Répondre

1

Non, ce n'est pas le cas. Je sais que c'est très irritant.

Mon premier essai à résoudre ce problème (j'eu le même problème) ajoutais ces usings:

using FilterRandom = BusinessLayer.FilterElements.FilterRandom; 

Le problème devient alors que vous devez ajouter un pour chaque espace de noms sous vous voulez inclure, et cela devient un gâchis.

Comment j'ai définitivement résolu ceci en changeant les espaces de noms dans le projet de sorte que, dans votre exemple, FilterRandom serait par exemple. être en BusinessLayer.

Le problème que vous voyez actuellement est que vous avez trop d'espaces de noms. Ce n'est pas étrange que ça arrive. Ils sont un excellent moyen d'organiser votre code et vos cours et ce n'est pas si difficile que ça. Ce que je veux dire en changeant les espaces de noms, c'est que j'ai fusionné plusieurs petits espaces de noms en plus grands. Cela signifie parfois renommer des classes, mais mon opinion est que le nom de classe sur lui-même devrait être significatif, sans le préfixe d'espace de noms.

De cette façon, j'ai résolu ces problèmes de façon permanente dans mon projet (60kloc) et cela a très bien fonctionné.

+0

Pieter, merci, mais je vais rester loin d'utiliser un alias. Peut-être trop déroutant pour les gars de maintenance sur la route. Le RandomFilter est actuellement dans le projet BusinessLayer. Voulez-vous dire utiliser une classe imbriquée? – MikeMalter

+0

@MikeMalter - Élargi la réponse. –