web-dev-qa-db-fra.com

Quelle est la meilleure façon de renommer un espace de noms en bloc sur une grande application c #?

Tout d'abord, un peu d'histoire.

Actuellement, les espaces de noms et les assemblys dans notre base de code (~ 60 assemblys, des milliers de classes) ressemblent

WidgetCompany.Department.Something

Nous avons maintenant été essaimés de telle sorte que nous vendons le logiciel qui gère une société Widget, nous aimerions donc renommer les espaces de noms et les assemblys

NewCompany.Something

Dans des circonstances normales, je resterais probablement avec l'ancien espace de noms, mais le problème est que nos clients ne veulent pas voir le nom d'un de leurs concurrents n'importe où dans l'application. Au cas où ils verraient une trace de pile, des propriétés d'assemblage, etc., cela ne devrait pas apparaître. Il ne s'agit pas de cacher nos associés ou de faire quoi que ce soit de sinistre, nous devons simplement nous assurer que les gens savent que nous sommes une entité distincte, une gestion distincte, et qu'ils n'ont pas à se soucier du partage des données, etc.

Maintenant la question. Quelle est la meilleure façon d'effectuer ce type de changement de nom global? Les éléments suivants devraient être modifiés:

  • Espace de noms pour (presque) toutes les classes de l'application
  • Chaque instruction using dans l'application qui fait référence aux anciens noms
  • Structure des dossiers pour chaque projet
  • Références entre projets qui reposent sur une structure de dossiers modifiée
  • Fichiers .Sln faisant référence à la structure de dossiers modifiée
  • Toutes les références à ces classes qui sont pleinement qualifiées (devraient être peu nombreuses et espacées)
  • Toutes les références à ces classes dans les fichiers de configuration xml (sections de configuration, etc.)
  • Fichiers AssemblyInfo.cs pour chaque assembly
  • AssemblyName dans chaque fichier .csproj

Suis-je coincé avec la stratégie trouver-remplacer-prier ou y a-t-il quelque chose de mieux?

38
Brook

Cliquez avec le bouton droit sur votre espace de noms actuel et sélectionnez Refactor -> Renommer et changez le nom dans la fenêtre contextuelle qui apparaît après un certain temps. Entrez votre nouveau nom et cliquez sur ok.

Si vous avez plusieurs profondeurs dans votre espace de noms, alors Visual Studio ne vous permettra pas de taper un point. Cependant, si vous copiez et collez un point, malgré un avertissement, il fera l'affaire.

47
franklins

ReSharper. Obtenez la version 5.1 de JetBrains gratuitement pendant 30 jours (plus que suffisamment de temps pour faire votre changement de nom). Placez le curseur sur l'espace de noms que vous souhaitez modifier et appuyez sur Ctrl-R deux fois (ReSharper Rename). Il fonctionnera avec un espace de noms de n'importe quel nombre de niveaux et convertit toute utilisation de cet espace de noms en un nouveau. Cependant, vous devrez changer chaque espace de noms unique dans votre solution (sauf si vous allez simplement avec Rechercher/Remplacer)

9
KeithS

Tout d'abord, j'essaierais Refactor->Rename option. Mais comme mentionné dans le commentaire pour une autre réponse, cela ne fonctionne pas si bien (ou je n'ai pas trouvé comment le faire fonctionner). Je préfère donc utiliser le scénario suivant, surtout si vous souhaitez ajouter un espace de noms supplémentaire.

1) Renommez votre espace de noms racine (WidgetCompany) en quelque chose comme NAMESPACE_TO_BE_REPLACED en utilisant Refactor-Rename
2) Remplacez NAMESPACE_TO_BE_REPLACED avec votre espace de noms final (NewCompany.WidgetSoftware) à l'aide de la boîte de dialogue de recherche et de remplacement

Et n'oubliez pas de renommer les projets, les espaces de noms par défaut, etc.

3
Snowbear

Si vous avez ReSharper:

  1. Cliquez avec le bouton droit sur le projet, Propriétés. Remplacez l'espace de noms par défaut par l'espace de noms souhaité.

  2. Projet de clic droit, Refactor -> Ajuster l'espace de noms pour mettre à jour tous les espaces de noms pour utiliser l'espace de noms par défaut

Ensuite, laissez-le faire sa magie.

2
Yodacheese
  • Ouvrez une classe aléatoire dans [WidgetCompany.Department.Something]
  • Édition-> Rechercher et remplacer-> Remplacer dans les fichiers
  • Tapez "WidgetCompany.Department.Something" dans la zone FindWhat
  • Tapez "NewCompany.Something" dans Remplacer par zone
  • Sélectionnez Projet en cours dans la zone Regarder dans.
  • Remplace tout
1
Bora Aydın

Visual Studio 2019 Community Edition prend en charge cela comme décrit ici . Il fonctionne pour n'importe quelle hiérarchie (avec des points, des changements d'espace de noms racine, etc.) et met à jour correctement toutes les dépendances.

  1. Placez votre curseur dans le nom de classe

  2. Appuyez sur Ctrl+. pour déclencher le menu Actions rapides et refactorisations

  3. Sélectionnez Déplacer vers l'espace de noms Move to namespace refactoring

  4. Dans la boîte de dialogue qui s'ouvre, sélectionnez l'espace de noms cible vers lequel vous souhaitez déplacer le type Select a namespace dialog box

1
DeepSpace101

Solution alternative si vous avez déjà partiellement renommé:

  • Ouvrir la recherche et le remplacement (raccourci ctrlh)
  • Assurez-vous que l'expression régulière est sélectionnée (icône comme .*)
  • Collez le nom complet de votre espace de noms actuel, par exemple YourSolution.YourProject
  • Collez cette expression régulière YourSolution.Your[partiallyRenamedNamespaceCharacters].*
  • Assure-toi Entire Solution est sélectionné et non Current Document
  • Courir
0
TomDane