7
votes

Assemblage ... Pages de noms internes et externes

J'ai une question rapide ici. J'ai une assemblée réutilisée par quelques développeurs contenant divers bits de fonctionnalité, mais il est techniquement divisé dans divers espaces de noms représentant des blocs logiques de fonctionnalité.

Maintenant, il est proposé avec aussi peu d'espaces de noms publics que possible. Fondamentalement, l'utilisateur ne devrait pas savoir (et ne sait pas actuellement) quelle structure interne est utilisée pour la classe qu'ils tentent d'utiliser.

Disons que vous avez ceci:

  • ns1

    • NS11
    • classe 111
    • classe 112
    • Extensions NS
      • Classe d'extension 1
      • NS12
      • ns2

        • ...

          Fondamentalement, les utilisateurs savent qu'ils utilisent l'imageName.ns1 pour la fonctionnalité générale concernant NS1. Maintenant, dans cet exemple simple, j'ai mis une classe contenant des méthodes d'extension dans des extensions d'espace de sous-noms, donc essentiellement si un utilisateur final tente d'utiliser l'Assemblée, il devait connaître la structure interne de la DLL pour connaître l'extension existante (C'est l'un de ces exemples où Intellisense ne vous dit pas que vous savez).

          So Bottom Line ... en ce moment, j'ai cette assemblée et interne (le projet VS), je divisez le projet en dossiers logiques comme on le ferait normalement, mais je ne laisse pas les espaces de noms à suivre les dossiers. De cette façon, l'Assemblée est divulguée dans des blocs logiques que les utilisateurs connaissent sans connaître les structures internes et n'ont pas besoin de savoir qu'il pourrait y avoir des espaces de noms séparés pour des extensions, etc.

          Maintenant, personnellement, j'aimerais que je sache si je pouvais laisser mes espaces de noms de mon code suivez ma structure de dossiers, mais carapez en quelque sorte ces espaces de sous-noms à l'espace de noms principal à la compilation.

          est-il possible d'une manière d'une manière ou d'une autre d'atteindre cette «redirection» comme vous le ferez?

          Pour le mettre simplement, je veux pouvoir adresser Ns1.ns11.class111 publiquement comme ns1.class111 en dehors de l'assemblage tout en conservant une structure appropriée à l'intérieur de l'assemblage.


5 commentaires

Question interessante. Un type ne peut vivre que dans un espace de noms. Si vous modifiez ns1.ns11.class111 sur ns1.class111 à (PRE) compilent l'heure, vous devrez également modifier toutes les références, comme existant (test) Le code s'attendra à ce qu'il soit dans ns1.ns11 .


Ma pensée personnelle est pourquoi n'utiliseriez-vous pas les mêmes espaces de noms en interne à l'extérieur? S'ils sont déroutants à une personne externe, alors pourquoi pas à une personne interne?


Ce n'est pas qu'ils sont déroutants. C'est juste que l'utilisateur final ne devrait pas avoir à connaître la structure interne pour pouvoir accomplir leurs tâches. Disons que vous avez une espace de noms d'utilitaires interne, qui contient, par exemple une classe de "crypter ', mais que vous souhaitez que votre utilisateur ait accès à tous vos services publics sans avoir à savoir qu'elle est considérée comme une utilité à l'intérieur de l'Assemblée.


Putain, les commentaires sont courts. :-) identre pour les classes d'extension et les classes d'exception personnalisées, vous souhaitez que votre utilisateur final ait accès aux classes disponibles dans la DLL sans manuellement à ne pas oublier d'ajouter l'espace de noms interne personnalisé. Importation de l'espace de noms de base.


Une mauvaise idée. Le code doit être dans 1 espace de noms uniquement, alors faites le choix. Lorsque vous ne voulez pas suivre la structure du dossier (juste une défaillance de VS sensible), ne l'utilisez pas. Mais ne le changez pas lors de la compilation (publier). Cela briserait tant de choses.


3 Réponses :


0
votes

Si vous devez fournir un accès à 3ème partie à un code interne via différents espaces de noms, je vais résumer l'accès aux données dans un assemblage distinct (qui dépend de l'original) ou d'utiliser un service Web pour offrir au sous-ensemble. de fonctionnalité que vous voulez qu'ils accèdent.

Vous pourrez peut-être faire quelque chose avec des attributs sur chacune de vos classes, même si j'imagine que cela deviendrait assez désordonné, assez rapidement.


0 commentaires

0
votes

Il y a quelques façons de penser à cela. Venir d'un fond vb.net à l'origine et c # Plus récemment, j'ai les commentaires suivants sur le sujet.

  1. La convention de dossier \ Namespace n'est pas adoptée dans VB.
  2. Comment vous allez adresser la version et la gestion de code.
  3. Si les autres développeurs C # sont apportés pour compléter votre équipe, ils pourraient avoir du mal à comprendre le détournement des espaces de noms / dossiers.
  4. Vous pouvez mettre l'espace de noms parent dans les propriétés CSPROJ, sous l'application "Espace de noms par défaut". Cela vous permettrait de partager ces utilités communes (dossiers) entre des projets via Copier et coller des dossiers de contrôle ou de contrôle de source ou de sous-produits. Cela permet à NS1.extensions et NS2.extensions d'inclure le même code.
  5. Je ne m'inquiéterais pas de "cacher" l'API interne de l'API d'entreprise interne à moins que ce soit un environnement technique particulièrement hostile. Même vos méthodes "chiffrer" doivent utiliser l'infrastructure de clé publique / privée appropriée pour la rendre sécurisée par la conception.
  6. Si vous regardez comment la plupart des cadres rompent la solution, vous verrez une série de projets qui incluent tout le code des espaces de noms tels que «Core», «partagé», «commun». La plupart de ces développeurs sont très intelligents, donc si c'est comme ça qu'ils font des choses, je suivrais.
  7. Avez-vous envisagé de Nugget à déployer dans un "dossier de réseau partagé" et configurez tous vos développeurs à Point VS à cet emplacement?
  8. Enfin, j'ai trouvé que les extensions et les méthodes d'assistant deviennent très stables très rapidement. Le code ne change pas trop. Je les poussez au dossier inclus dans mon contrôle source /library/mybusinessname/nameofservice.1.0.0.0 / . Que la même structure de dossiers que les packages Nuget utilisent, donc je sais quand une édition de mon code sous-jacent ou des cadres sous-jacents est en cours d'utilisation.
  9. Enfin, si vous allez avoir votre code descendre dans le PATH MVVM (Populaire) et votre voir la valeur dans Injection de dépendance , alors vous allez avoir à inclure de nombreuses "interfaces" à Aidez à tester votre code commun commun, qui est beaucoup plus facile dans une DLL / projet distinct.

    Personnellement, j'ai travaillé avec une équipe qui a importé tout le code source sous-jacent pour tout ce qu'ils ont référencé dans son logiciel d'entreprise, ils pourraient donc "changer". À la fin de la journée, il a créé un niveau impie de complexité de la construction et a effrayé le pantalon de moi lors du débogage. Nuget fournit un modèle très populaire et très populaire, celui que j'ai adopté pour le code "partagé" d'entreprise. Si j'ai besoin de "Tweek" du code partagé, je le fais dans la solution / projet séparément, testez-le, déployez-le et utilisez le contrôle de source ou Nugget pour copier les fichiers.


0 commentaires

0
votes

Voici une idée: Créez Cours d'emballage pour le public fort>. Il peut être un peu inefficace (bien que JIT puisse s'en occuper) et relativement un peu plus difficile à entretenir, mais si vous êtes inquiet de vos API publiques (que vous devriez être), cela pourrait être une bonne option. Enchaînant quelques appels ne sera pas une préoccupation dans la plupart des cas et vous auriez un calque concerné par l'API publique, vous permettant potentiellement de commettre quelques péchés derrière votre façade (enfreindre de bonnes règles de conception logicielles pour le des performances par exemple)

Vous pouvez créer votre structure interne, mais vous aimez: p> xxx pré>

.. puis créez une emballeuse publique pour la fonctionnalité interne avec les espaces de noms que vous souhaitez Exposer: P>

namespace Framework.Cool
{
    public class Beans
    {
        // omitted code for brevity
        public bool Cook()
        {
            return _beansWeWantToCook.Cook();
        }
    }
}


0 commentaires