¿Qué es Castle Windsor y por qué debería importarme?


190

Soy un desarrollador de Windows desde hace mucho tiempo, que me corté los dientes en win32 y principios de COM. He estado trabajando con .NET desde 2001, por lo que soy bastante fluido en C # y CLR. Nunca había oído hablar de Castle Windsor hasta que comencé a participar en Stack Overflow. He leído la guía "Comenzando" de Castle Windsor, pero no está haciendo clic.

Enséñele a este viejo perro nuevos trucos y dígame por qué debería integrar Castle Windsor en mis aplicaciones empresariales.


1
Lea sobre Inversión de control. Es muy útil para ayudarlo a desacoplar dependencias, lo que lo ayudará mucho en la escritura de pruebas unitarias, para empezar.
Dan Csharpster

Respuestas:


358

Castle Windsor es una herramienta de inversión de control. Hay otros como este.

Puede darle objetos con dependencias preconstruidas y cableadas allí mismo. Un gráfico de objeto completo creado a través de la reflexión y la configuración en lugar del operador "nuevo".

Comience aquí: http://tech.groups.yahoo.com/group/altdotnet/message/10434


Imagina que tienes una clase de envío de correo electrónico. EmailSender. Imagine que tiene otra clase WorkflowStepper. Dentro de WorkflowStepper necesita usar EmailSender.

Siempre puedes decir new EmailSender().Send(emailMessage);

pero eso, el uso de new, crea un ACOPLAMIENTO APRETADO que es difícil de cambiar. (Este es un pequeño ejemplo artificial después de todo)

Entonces, ¿qué pasa si, en lugar de renovar a este chico malo dentro de WorkflowStepper, lo pasa al constructor?

Entonces, quien lo llamó tuvo que actualizar el EmailSender.

new WorkflowStepper(emailSender).Step()

Imagine que tiene cientos de estas pequeñas clases que solo tienen una responsabilidad (google SRP) ... y usa algunas de ellas en WorkflowStepper:

new WorkflowStepper(emailSender, alertRegistry, databaseConnection).Step()

Imagine no preocuparse por los detalles de EmailSendercuándo está escribiendo WorkflowStepperoAlertRegistry

Simplemente te preocupas por la preocupación con la que estás trabajando.

Imagine que todo este gráfico (árbol) de objetos y dependencias se conecta en el TIEMPO DE EJECUCIÓN, de modo que cuando haga esto:

WorkflowStepper stepper = Container.Get<WorkflowStepper>();

obtienes un trato real WorkflowSteppercon todas las dependencias que se completan automáticamente donde las necesitas.

No hay new

Simplemente sucede , porque sabe lo que necesita qué.

Y puede escribir menos defectos con un código DRY mejor diseñado de forma comprobable y repetible.


30
¡INCREÍBLE! ¡Bien escrito! AHORA estoy emocionado por eso.
David Hill

1
Gracias. Hay mucho más que eso. Elegí un ejemplo muy simple y dolorosamente concreto. Puede usar interfaces para cambiar implementaciones. Puede configurar automáticamente ensamblajes completos. Puede especificar ciclos de vida como singleton o por solicitud http, etc. Continúe: cambiará su trabajo.
Matt Hinze

66
Y para ayudar a la gente de Java: Esto es Guice para .NET ;-)
Mark Renouf

55
Me parece que, en mi experiencia, es más difícil de depurar porque ¿dónde se inicializan los objetos? - En un proyecto grande es difícil encontrar la raíz de la inicialización. Prefiero la forma antigua de usar new, sé dónde está todo entonces. Tampoco me gusta la idea de usar reflejos y es realmente una caja negra, un código que no poseemos y, por lo tanto, no entendemos completamente.
Luke T O'Brien el

1
@nashwan Sí, estoy escribiendo una prueba de unidad, pero los principios de IoC / DI se pueden aplicar sin Castle Windsor o cualquier marco de terceros, para mí simplemente agrega otra dependencia, ese fue el punto de mi comentario. Simplemente no veo las ventajas de Castle Windsor.
Luke T O'Brien el


3

Creo que IoC es un trampolín en la dirección correcta en el camino hacia una mayor productividad y disfrute del equipo de desarrollo (incluidos PM, BA y BO). Ayuda a establecer una separación de preocupaciones entre los desarrolladores y para las pruebas. Da tranquilidad al diseñar, lo que permite flexibilidad ya que los marcos pueden entrar y salir.

La mejor manera de lograr el objetivo que IoC (CW o Ninject, etc.) apuñala es eliminar la política # 1 y # 2 para eliminar la necesidad de que los desarrolladores se pongan en la fachada de la falsa comprensión al desarrollar. ¿Estas dos soluciones no parecen estar relacionadas con IoC? Son :)


3

Castle Windsor es. Dependency Injection container.Con la ayuda de esto, puede inyectar sus dependencias y usarlas sin crearlas con la ayuda de una nueva palabra clave. Por ejemplo, considere que ha escrito un repositorio o un servicio y desea usarlo en muchos lugares, primero debe registrar su servicio / repositorio y puede comenzar a usarlo después de inyectarlo en el lugar requerido. Puedes echar un vistazo al siguiente tutorial que seguí para aprender el castillo de Windsor.

enlace .

Espero que te ayude.


1

En pocas palabras. Imagine que tiene alguna clase enterrada en su código que necesita algunos valores de configuración simples para hacer su trabajo. Eso significa que todo lo que crea una instancia de esa clase necesita obtener esas dependencias, por lo que generalmente tendrá que refactorizar un montón de clases en el camino para pasar un poco de configuración al lugar donde se crea la instancia.

Entonces, o muchas clases se alteran innecesariamente, agrupa los valores de configuración en una gran clase de configuración que también es mala ... ¡o peor aún, vaya al Localizador de servicios!

IoC le permite a su clase obtener todas sus dependencias sin esa molestia, y también maneja vidas de instancias más explícitamente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.