Me resulta útil organizar espacios de nombres en una jerarquía y hacer que los nombres de los ensamblajes coincidan con el espacio de subnombres al que contribuyen. Por ejemplo, un proyecto llamado Womble tendría un espacio de nombres de primer nivel Womble, y entonces no podría ser ensamblados llaman:
Womble.ClientLibrary.dll
Womble.Controls.dll
Womble.Util.dll
Womble.Interop.dll
Aquí, el espacio de nombres externo Womble abarca varios ensamblados, pero cada conjunto tiene un subespaciodenombres única que sólo puede contribuir, que se encuentra al eliminar .dll del final. Hace que sea mucho más fácil recordar lo que necesita para hacer referencia y para encontrar cosas.
En cuanto a un gran número de conjuntos, en última instancia, no es necesario que los guarde todos en una sola solución. En el desarrollo a gran escala, ayuda a dividir un gran producto en subsistemas, que a su vez pueden consistir en múltiples ensamblajes, y cada subsistema puede terminar siendo mantenido por equipos separados, y puede tener sus propios archivos de solución. Los diversos equipos "lanzan" nuevas versiones entre sí a través del control de código fuente, tratándose entre ellos como bibliotecas de terceros.
No creo que haya una manera difícil y rápida de decidir cómo dividir el software en partes iguales. Aquí hay un principio general: las cosas que cambian por diferentes razones deben separarse.
Los proyectos muy grandes pueden beneficiarse del hecho de que al colocar elementos en ensamblajes separados, puede parcharlos por separado. Puede generar una revisión para un problema en Womble.Interop.dll, y luego producir por separado un hotfix para un problema en Womble.Controls.dll, y dar ambos al mismo cliente, de modo que, en teoría, esos dos ensamblajes podrían ser completamente mantenido y respaldado por equipos separados, sin tener que coordinar sus actividades directamente.
Los ensamblajes separados también crean claridad en las dependencias entre códigos. Puede ver a un nivel muy alto (solo mirando la lista de referencias) cómo un trozo de código depende de otro y cómo puede ser reutilizado. Si pones todo en un solo conjunto, podría ser un gran desastre enredado sin un patrón sensible.
Este es también mi actual forma de trabajar. A menudo veo a los desarrolladores dividir la aplicación en 3 ensamblajes porque la mayoría de ellos piensa que una 3 capas en 3 ensamblajes es algo bueno que hacer; pero esto también se puede lograr mediante capas de espacios de nombres y mantener todo el conjunto en 1. Solo cuando la seguridad y el rendimiento son actores clave, comience a investigar cómo particionar físicamente su aplicación. –