2010-08-04 10 views
23

Tenemos una aplicación web de enterpise que constaba de 4 componentes compilados (DLL). Hace más de un año, comenzamos a implementar componentes más granulares en un intento de aislar la funcionalidad, reducir el acoplamiento y reducir el riesgo de recompilar y desplegar grandes cantidades de código. Si bien nadie aduce que este enfoque nos haya brindado MUCHA flexibilidad y velocidad en el mercado al agregar nuevas funcionalidades y reparar errores, las aplicaciones ahora constan de casi 40 dlls. Tenemos una convención de nomenclatura que funciona bien para identificar nuestros componentes.¿Son malas las aplicaciones con muchos archivos DLL?

Mi pregunta es: ¿Hay algún inconveniente (Rendimiento, mantenimiento, etc ...) en tener una aplicación con muchos dlls?

Editar: Estamos explorando la opción de código de refactorización en componentes más grandes que creo que podría ser una regresión de tipo ...

Respuesta

14

Mi pregunta es: ¿Hay alguna abajo del lado (rendimiento, mantenimiento, etc ...) para tener una aplicación con muchas dlls?

¿Una desventaja con muchas DLL? No
¿Una desventaja con demasiadas DLL? Por supuesto.

Entonces, ¿cuántos son demasiado?

Un ensamblaje es un medio de organización, como espacios de nombres y clases. Los espacios de nombres definen límites lógicos, ensambla límites físicos.

Debe intentar mantener los ensamblajes coherentes y verlos como módulos del sistema.

Y sí, habría un problema de rendimiento (pequeño) si tuviera cientos de ellos.Pero con 40, no veo un problema.

7

Mantenimiento - no, el rendimiento - sí. Cuantos más montajes necesite cargar, más lenta será la aplicación. Para cada ensamblaje que se debe cargar en AppDomain, el cargador necesita realizar una serie de verificaciones.

+0

El usuario inicial experimentará un impacto en el rendimiento, pero los usuarios posteriores no tendrán la misma experiencia ... ¿correcto? – Achilles

+0

@Achilles, correcto, una vez JITed debería estar bien. –

+0

También es posible (dependiendo de la arquitectura de su aplicación) cargar dinámicamente estos ensambles "según sea necesario" (es decir, se accede a la funcionalidad, si es posible) para permitir que la aplicación cargue inicialmente más rápido y le otorgue al usuario una percepción general más rápida * * impulso de rendimiento. – CraigTP

5

Los tipos de problemas que empeoran con más archivos DLL son:

  • tiempos de construcción: el compilador se ejecuta una vez para cada DLL y DLL se debe copiar en y desde el directorio de salida
  • Tiempos de carga: cada archivo DLL debe ser cargado por separado por Windows, aunque los archivos DLL se cargan por demanda, por lo que normalmente incurrirá en costos solo para las piezas que usa
  • Rebasing: cuantos más archivos DLL hav e, mayor es la probabilidad de que dos colisionen en la memoria virtual. Esto no representa un problema, porque Windows puede volver a basar uno de ellos, pero el proceso de reescalado lleva tiempo, y Windows debe cargar las páginas DLL afectadas del disco con anticipación. Rebase no suele afectar mucho a las DLL administradas.
  • Visual Studio sobrecarga: una DLL = = un proyecto más trabajo para el IDE

El consejo que sigo es utilizar DLL para organizar su despliegue, y espacios de nombres de organizar el código. Si encuentra que siempre libera un conjunto determinado de archivos DLL juntos, también podría fusionarlos.

+1

Puede reducir el tiempo de compilación desactivando la característica 'copiar local' de un proyecto. Esto puede reducir seriamente el tiempo de construcción. Pattrick Smacchia escribió un artículo en el que explica cómo hacer esto: http://codebetter.com/blogs/patricksmacchia/archive/2009/01/11/lessons-learned-from-the-nunit-code-base.aspx. – Steven

+0

La mayoría de las técnicas de ensamblaje/espacio de nombres que sigo ahora lo aprendí de Patrick –

12

La separación de dominios funcionales independientes en archivos DLL individuales generalmente es buena cosa. Ayuda a introducir el potencial de reutilización y ayuda a mitigar la introducción de un acoplamiento inadecuado entre las implementaciones internas de las clases.

Sin embargo, hay desventajas a la introducción de varios ensamblados como parte de un sistema:

  1. se tarda más tiempo en cargarse, verificar, y múltiples conjuntos de JIT. Sin embargo, esto rara vez es un problema, y ​​en general no debería ser su principal preocupación al decidir cómo particionar la funcionalidad de una aplicación.
  2. No es prudente actualizar una aplicación implementando cambios dentro de un solo ensamblaje. A menudo, dividir una aplicación en archivos DLL separados crea la impresión de que es posible corregirlo o mejorarlo reemplazando solo algunos de sus ensamblajes. Si bien es ciertamente posible, puede introducir errores sutiles si hay cambios en los efectos secundarios o comportamientos no documentados de las clases y métodos en esos ensamblajes.
  3. Puede ser más difícil entender un sistema que está dividido en demasiados conjuntos. Herramientas como ReSharper y CodeRush tienen algunas limitaciones cuando se analiza el código dividido en varios ensambles.
  4. Puede alentar a los desarrolladores a hacer más tipos públicos de lo que deberían. Dado que solo los tipos públicos pueden ser consumidos y heredados por otros ensamblajes, un proyecto de ensamblaje múltiple puede generar más tipos públicos de los deseados.
+0

. Debe tenerse en cuenta que puede mitigar el # 4 aprovechando el atributo de nivel de ensamblaje InternalsVisibleTo. Los ensamblados que deberían poder tener referencias a los demás elementos, pero las cosas que están fuera de esos ensamblajes no deberían, puede usar internal y usar el atributo para hacerlo visible para el otro ensamblado. – RationalGeek

+0

@jkohlhepp: cierto. También podría darle a ese grupo de ensamblados nombres fuertes para limitar qué otras asambleas podrían ** realmente ** acceder a esos tipos. – LBushkin

3

No olvides ILMerge. Funciona bastante bien si desea las múltiples DLL para el desarrollo (proyectos diferentes), pero un EXE para la implementación (más rápido de cargar, más fácil de implementar).

La desventaja de ILMerge es que fallará en algunos escenarios de carga dinámica, por ejemplo, crear una instancia de un tipo por nombre (cadena). Entonces, ILMerge puede o no ser factible, dependiendo de su proveedor de IoC.

Cuestiones relacionadas