Comparando Castle Windsor, Unity y StructureMap

En un seguimiento de la statement de Krzysztof de que Windsor hace mucho más que otros IoC, quería entender cómo estos IoC se comparan unos con otros y con los beneficios / instalaciones adicionales que brinda el castillo de Windsor.

¿Hay alguna comparación? ¿Alguien puede ayudarme a comprender las características adicionales que proporciona Castle Windsor sobre otros IoC?

    Vea aquí y aquí para una comparación técnica bastante completa de varios contenedores de IoC, aunque algo obsoletos ahora (son de antes de Windsor 2.0)

    Sin embargo, no creo que realmente haya algunas características vitales que Windsor ofrece y otros contenedores no. Windsor , StructureMap , Spring.NET han existido durante varios años y se han utilizado en muchos proyectos durante estos años, por lo que ahora son muy maduros. Los contenedores más nuevos, como Autofac , Unity , Ninject y SimpleInjector, se basan en esa experiencia previa para que no carezcan de esas funciones vitales.

    Ahora, la parte más subjetiva de la respuesta: me gusta pensar que Windsor tiene una buena combinación de módulos de usabilidad, extensibilidad e integración.

    Usabilidad : por ejemplo, puede usar el registro de código XML y / o (también tiene una API fluida como la mayoría de los contenedores en la actualidad).

    Extensibilidad : muchos puntos de extensión que puede usar para personalizar o anular casi cualquier comportamiento predeterminado.

    Integración : Windsor tiene muchas instalaciones (módulos) que permiten una fácil integración con otros marcos / bibliotecas. Otras integraciones incluyen ASP.NET MVC , MonoRail , Workflow Foundation , NServiceBus , MassTransit , Rhino Service Bus , Quartz.Net , SolrNet , SolrSharp , Windows Fax Services .

    Esta serie de artículos cubre muchas sutilezas y puntos de extensión de Windsor.

    Tenga en cuenta que no estoy diciendo que otros contenedores no ofrecen cosas similares! Incluso si seleccionó uno de ellos y más tarde descubrió que le falta algo de integración, generalmente no es difícil codificarlo usted mismo.

    En pocas palabras : no creo que pueda equivocarse con ninguno de los contenedores principales de IoC, siempre y cuando estructure su código correctamente (por ejemplo, evite el antispam del localizador de servicios).

    Para mí, hay dos características de Windsor que no creo que la mayoría de los demás contenedores ofrezcan.

    • Posibilidad de trabajar de una manera independiente del contenedor: esto significa que su contenedor puede arrancar todo el código por usted y puede aprovechar al máximo sus capacidades sin tener que hacer referencia alguna a los ensamblados de Castle. *. Dll en sus ensamblajes que no sean de infraestructura. Esto es gracias a características como Lazy Component Loaders, DynamicParameters y Typed Factory Facility, que no le impiden aprovechar las capacidades avanzadas del contenedor, evitan codificar manualmente la capa de integración o utilizar Service Locator, que como @ploeh escribió es un patrón anti.

    • un ecosistema de extensibilidad / extensiones muy rico que puede proporcionarle capacidades realmente potentes y reducir en gran medida la cantidad de código de plomería que tiene que escribir. Puede que esto no suene poderoso, pero lo agradecerás una vez que aproveches elementos como WCF Facility en un proyecto y luego en otro no podrás usarlo. La parte de extensibilidad significa que aunque Windsor no intenta (este es su objective de diseño) resolver todos los problemas que pueda tener de manera inmediata, es muy extensible, lo que significa que puede modificarlo y girarlo para hacer casi cualquier cosa que pueda necesitar.

    Aparte de eso, me gusta cómo funciona Windsor, como se esperaba (al contrario de otros contenedores ) y cómo soluciona las pequeñas cosas . Por ejemplo, crear servicios decorados es muy simple. También me gusta mucho la API de registro fluido, que funciona muy bien para ambos escenarios simples, y no se torce demasiado y se complica cuando se quiere hacer algo avanzado. Además de muchas otras cosas pequeñas, aunque aquí las cosas pueden ser bastante subjetivas.