¿Hay alguna guía para decidir cuándo una clase debe estar en su propio ensamblado / DLL? A menudo veo dos escuelas de pensamiento:
1) Cada "agrupación" de clases pertenece a su propia DLL, por ejemplo, repositorios, servicios, DTO, infraestructura, etc.
2) Todo debe estar en una única DLL pero separada por espacios de nombres / carpetas, por ejemplo, tener una DLL "Core" con espacios de nombres adicionales, por ejemplo, Core.Repositories, Core.Services, Core.DTO, etc.
En el trabajo, agrupamos todo en una sola Asamblea llamada "Negocios". Hay algunas carpetas, pero no hay una separación real: los objetos comerciales (con lógica, algunos de los cuales ni siquiera deberían ser clases) se agrupan en una carpeta "BusinessObjects" sin cuidado. Las cosas usadas en más de una clase están en una carpeta "Core". Las utilidades se encuentran en una carpeta de "Utilidades", la infraestructura de acceso a datos es una carpeta de "Datos": se entiende la idea.
Para un nuevo módulo en el que estoy trabajando, quiero / necesito tener una capa de acceso a datos separada (piense en una implementación de repositorio rudimentaria) pero no quiero simplemente arrojarla a la carpeta "BusinessObjects" con los otros 160 (!) clases allí. Al mismo tiempo, me preocupa crear una nueva Biblioteca de clases, ya que todos están acostumbrados a rellenar una clase en la Biblioteca individual; Sin embargo, una carpeta / espacio de nombres podría funcionar.
fuente
"Tío Bob" Martin de Clean Code, SOLID Principles fame ha esbozado tres principios aquí :
La regla general es que debe mantener el número de proyectos en su solución lo más bajo posible. Solo divídalos si necesita hacerlo para implementar una o más historias de usuario específicas, o si tener un solo ensamblaje está causando problemas de rendimiento medibles (por lo general, una vez que alcanzan varios megabytes de tamaño).
fuente
Algunos otros principios rectores con los que trabajo:
¿Crees que volverás a usar este código en otros proyectos? Para un grupo de aplicaciones web relacionadas, teníamos un módulo relacionado con la cuenta de usuario que todas las aplicaciones usaban, ya que todas usaban el mismo modelo para cuentas de usuario e inicios de sesión. He hecho cosas similares con las bibliotecas de geometría y matemáticas y las reutilicé en múltiples aplicaciones, simplemente al incluir la DLL.
¿Desea poder modificar / implementar este código sin volver a implementar / recompilar todo el proyecto? A veces ha sido útil simplemente reconstruir el módulo, implementar y reiniciar la aplicación web.
Parece que en su caso un Repositorio básico y genérico podría ser útil nuevamente en el futuro, podría valer la pena separarlo en una nueva DLL si es posible.
fuente