Dans .NET (Visual Studio), quand créez-vous un nouvel assembly?

9

Je travaille sur une application Silverlight. Je l'ai divisé en plusieurs assemblées:

  • Domaine
  • Référentiels (tout avec persistance dans la base de données Sterling)
  • UI
  • ...

C'est comme ça que je l'ai appris, mais je me suis demandé. Si vous savez que les DLL ne vont pas être réutilisées, est-il nécessaire de les diviser? Ou pourriez-vous tout mettre dans un seul assemblage et utiliser des dossiers et des espaces de noms pour le garder en ordre?

J'ai également vu des projets qui ont trop d'assemblages. Au lieu d'utiliser des espaces de noms là où cela aurait été approprié.

Alors: quand créez-vous un nouvel assemblage pour un nouveau morceau de code? De bonnes ressources à ce sujet? Et divisez-vous le code techniquement (domaine, données, interface utilisateur, etc.) et / ou fonctionnel (c'est-à-dire administration des patients, patient-médical, logistique hospitalière, ... - probablement uniquement pour des applications plus grandes au niveau de l'entreprise)?

Peter
la source

Réponses:

1

Je recommande de créer des assemblys séparés pour les classes qui tombent logiquement dans des "modules". Non seulement c'est bon pour la réutilisation et la maintenance, mais c'est aussi un moyen d'imposer le moins de dépendances entre les classes.

La mission sera de minimiser le nombre de références à d'autres assemblys dont chaque assemblage a besoin, principalement par le biais d'interfaces et d'événements. Avoir des classes dans différents assemblys rendra les dépendances très évidentes. Si vous n'utilisez qu'un seul assemblage, il est très facile de négliger de penser aux dépendances, car tout est accessible.

Bien sûr, vous ne devez pas exagérer mais vous séparer le cas échéant. Pensez-y comme ceci: "Ces classes vont de pair et n'ont pas besoin de connaître ces classes" et se séparent le long de ces lignes

Homde
la source
1
Cela dépend de ce que vous entendez par «modules», mais je divise généralement la logique associée en utilisant des espaces de noms plutôt que des assemblys. N'oubliez pas que les espaces de noms peuvent s'étendre sur des assemblys. Les assemblys sont l'unité de déploiement et vous devez donc envisager de couper vos assemblys pour qu'ils correspondent à votre scénario de déploiement.
Ed James
3
Pas une bonne idée. VS devient très lent lorsqu'une solution contient plus de quelques projets.
nikie
4
Si votre VS devient trop lent, vous utilisez soit une ancienne version soit un ordinateur lent. J'ai d'énormes projets avec plus de 30 projets qui se compilent en quelques secondes. Là encore, j'ai beaucoup de RAM, de cœurs et un SSD :) Vous ne devriez pas exagérer bien sûr, mais seulement les séparer le cas échéant, pensez-y comme ceci "Ces classes vont de pair et n'ont pas besoin de connaître ces classes" et séparer le long de ces lignes
Homde
Marqué cela comme réponse en raison de la remarque sur les dépendances. La réponse d'Ed James est au moins aussi valable et correcte, mais cette réponse est plus applicable à ma situation.
Peter
2
À la suite de cette approche , vous pourriez finir avec un tas d'assemblées: A, B, C, D, E, F, G, H, I, J, K. Où que vous faites référence à l' assemblage A, vous devez également faire référence à ses assemblées dépendantes: B, C, D. Mais l' assemblage Cdépend: E, F, G, Hdonc nous allons avoir besoin de ceux qui sont trop. Donc, chaque fois que vous avez besoin d'une fonction, Avous devez dérouler 7 assemblages supplémentaires pour le faire fonctionner; en vous assurant d'obtenir les versions correctes de chaque assemblage. Bienvenue dans la nouvelle DLL Hell.
Ed James
14

Un assembly est l'unité de déploiement d'une application .NET; vous devez donc envisager de faire correspondre la coupe de vos assemblages avec votre architecture de déploiement.

Les assemblys sont également utiles lorsque vous avez besoin d'un contrôle de version distinct sur du code. Par exemple, lorsque vous disposez d'interfaces communes qui bénéficieraient d'un contrôle de version indépendant, vous devez séparer ce code dans un assembly.

N'oubliez pas que les espaces de noms peuvent s'étendre sur des assemblys. Dans de nombreux cas, il suffit de séparer le comportement à l'aide d'espaces de noms. Regardez le .NET mscorlib.dllqui dans un seul assembly contient du code qui couvre un vaste éventail de comportements séparés uniquement par un espace de noms.

Si vous voulez une certaine autorité à ce sujet, ne cherchez pas plus loin:

Lignes directrices sur la conception du cadre

Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries (2nd Edition) par Krzysztof Cwalina et Brad Abrams.

Ed James
la source
Merci pour la référence du livre en effet. Je vais vérifier ça. Pourriez-vous élaborer sur l'architecture de déploiement? En quoi le déploiement de 10 fichiers DLL différerait-il du déploiement 1? À moins que vous ne puissiez mettre à jour l'un des dix fichiers, alors que les autres restent intacts?
Peter
1
@Peter: si vous avez codé 10 assemblys qui sont toujours déployés ensemble, vous pouvez simplifier le contrôle de version et le déploiement en mettant tout le code dans un seul assembly. Si les 10 assemblages ne sont pas toujours déployés ensemble, avoir des assemblages séparés peut être utile.
Ed James