unity net library ioc .net asp.net dependency-injection inversion-of-control castle-windsor

.net - net - Castle Windsor ¿hay algún inconveniente?



autofac c# library (7)

He estado investigando el proyecto del Castillo y específicamente Windsor. Estoy tan impresionado con lo que es posible con esta tecnología y los beneficios de tener un sistema tan débilmente acoplado son definitivamente evidentes. Lo único de lo que no estoy seguro es si el uso de este método tiene algún inconveniente, específicamente en asp.net. por ejemplo, éxitos de rendimiento, etc.

Estoy tratando de hacer que los beneficios de este enfoque sean visibles para mis compañeros desarrolladores aquí y estoy siendo golpeado con los siguientes regresos:

  1. Eso es usar la reflexión y cada vez que se llama un objeto desde el contenedor, se debe usar la reflexión para que el rendimiento sea terrible. (¿Es este el caso? ¿Utiliza el reflejo en cada llamada?)

  2. Si confío en las interfaces; ¿Cómo trato con objetos que tienen métodos y propiedades adicionales que se han añadido a la clase? (a través de la herencia)


Costos significativos de puesta en marcha, casi ningún rendimiento alcanzado durante la operación (no hay reflejo para las llamadas, por supuesto, todo está compilado durante la creación de instancias). Windsor es un poco pesado, pero con un manejo adecuado de por vida no debería causar ningún problema.

Una desventaja más importante es que los problemas de integración no se detectan durante la compilación, y algunos ni siquiera en el lanzamiento. Sin un cuidadoso seguimiento de todas las versiones de los módulos y pruebas continuas de todo el sistema, es fácil meterse en problemas. La reflexión ayuda aquí, por lo que Windsor es mejor en ese aspecto que muchos otros marcos DI.



He utilizado contenedores IoC (Spring.NET y StructureMap) en varias aplicaciones de producción con mucha carga (no Facebook / MySpace alto, pero lo suficiente como para estresar algunos servidores).

En mi experiencia, incluso antes de comenzar a usar IoC, la mayor preocupación de rendimiento es la base de datos y la interacción con la base de datos: optimización de consultas, índices, uso de almacenamiento en caché de segundo nivel, etc.

Si tiene una base de datos involucrada con su aplicación, entonces el rendimiento que golpee a Windsor o cualquier otro contenedor puede ser infinitamente pequeño en comparación con un DB de ida y vuelta.

Esto es como las personas que comparan el rendimiento alcanzado por el nuevo operador () vs. Activator.CreateInstance () a 1-10ms cuando una ida y vuelta de una sola DB suele ser un orden de magnitud más costosa.

Te aconsejaría que no te preocupes por las cosas pequeñas y te concentres en las cosas importantes.

Además, me gustaría aconsejarle que consulte StructureMap, ya que creo que tiene mucha más funcionalidad que Windsor y no tiene muchas deficiencias de Windsor (es decir, aferrándose a las referencias y exigiéndole que las libere, etc.) .


Un problema con Castle Windsor que encontré es que no se puede ejecutar en Medium Trust (sin recompilación que no pude hacer). Entonces necesité cambiar de Windsor a Unity.

De acuerdo con el rendimiento de DI / IoC, creo que el rendimiento no es grande, especialmente si se tiene en cuenta el poder que tiene.

Por cierto: si está comenzando con DI / IoC, debería leer este artículo de MSDN .


La única excepción en la que el rendimiento de un contenedor IoC es inaceptable en mi experiencia es cuando trato de integrar / envolver el contenedor IoC como IServiceProvider para usar en el ComponentModel; un ejemplo común una vez que esto fue al crear su propio diseñador de winforms alojado (normalmente a construir algún tipo de diseñador personalizado, es decir, flujo de trabajo / diagrama de flujo, etc.)

Debido a la forma en que se comportan varios componentes de winforms, especialmente en tiempo de diseño, el costo de resolver un componente provocará que el mouse "tartamudee" al arrastrar porque el marco puede hacer más de 30,000 llamadas de resolución de servicio por segundo: esto es más una reflexión sobre las malas prácticas de codificación en los propios componentes, aunque creo, o al menos debido a las suposiciones que se hacen sobre la rápida o simple implementación de los proveedores de servicios.

En la práctica, nunca he encontrado que los tiempos de resolución de los componentes sean un problema incluso en aplicaciones comerciales muy cargadas.


Para responder tu pregunta:

  1. Eso es usar la reflexión y cada vez que se llama un abyecto desde el contenedor, se debe usar la reflexión para que el rendimiento sea terrible. (¿Es este el caso? ¿Utiliza el reflejo en cada llamada?)
  • No, no lo hace. La mayoría de las veces usa poca reflexión cuando registra el componente. También puede usar la reflexión al generar el tipo de proxy, la primera vez que solicita un componente del contenedor.
  1. Si confío en las interfaces; ¿Cómo trato con objetos que tienen métodos y propiedades adicionales que se han añadido a la clase? (a través de la herencia)
  • Todo es una cuestión de diseño. No desea tener todos y cada uno de los objetos creados por el contenedor. Lo usa principalmente para dependencias de servicio. En este caso, no te importa qué tipo se esconde detrás de la interfaz (ese es el objetivo, ¿no?).

También puede tener componentes de clase, pero tienen limitaciones, y debe tenerlos en cuenta (por ejemplo, no puede interceptar llamadas a métodos no virtuales). He encontrado que Windsor es la más madura y la más adecuada para mi estilo de contenedor de desarrollo.

Aparte de eso, Rendimiento, no he oído hablar de un proyecto que tuvo que descartar contenedor de dependencia debido a un rendimiento inaceptable. Windsor es realmente inteligente al respecto y almacena los resultados de las operaciones prolongadas para que no tenga que pagar el precio dos veces. Puede encontrar tablas en Internet, que comparan la velocidad de muchos contenedores de IoC. Dos cosas para tener en cuenta: todos los contenedores son realmente rápidos. No piense que el hecho de que otros contenedores sean más rápidos en estas cartas que Windsor, significa que son mejores. Windsor hace muchas cosas para ti que otros contenedores no.


  1. Eso es usar la reflexión y cada vez que se llama un objeto desde el contenedor, se debe usar la reflexión para que el rendimiento sea terrible. (¿Es este el caso? ¿Utiliza el reflejo en cada llamada?)

Por lo que respecta a conocer todos los buenos contenedores (Castle Windsor incluido aquí), utilice la reflexión para crear nuevas instancias. Sin embargo, esto es mejorar el rendimiento. Esto es para comparar con Activator.CreateInstance que es mucho más lento. Algunos otros Contenedores son bastante rápidos y pueden competir con el nuevo operador. Vea la marca de comparación aquí . Castle Windsor no es de los de alto rendimiento, sin embargo, la velocidad no es realmente importante. Cuando se trata del uso de IoC en la aplicación. El 90% de tus clases deben estar instaladas como singletones y esto significa trabajar solo al inicio de tu aplicación.

  1. Si confío en las interfaces; ¿Cómo trato con objetos que tienen métodos y propiedades adicionales que se han añadido a la clase? (a través de la herencia)

Prueba este tutorial y este tutorial. Le revelará la respuesta a su pregunta. Si desea evitar problemas de diseño y un software fácil de mantener, le recomiendo que busque prácticas SÓLIDAS.