windsor injection dependency control inversion-of-control castle-windsor property-injection

inversion of control - injection - Windsor Container: ¿Cómo especificar una propiedad pública no debe ser llenado por el contenedor?



inversion of control c# (5)

Al instanciar una clase, Windsor trata de forma predeterminada todas las propiedades públicas de la clase como dependencias opcionales e intenta satisfacerlas. En mi caso, esto crea una dependencia circular bastante complicada que hace que mi aplicación se cuelgue.

¿Cómo puedo decirle explícitamente a Castle Windsor que no debería tratar de satisfacer una propiedad pública? Supongo que debe haber un atributo en esa medida. No obstante, no puedo encontrarlo, así que avísenme el espacio / ensamblaje de nombres adecuado.

Si hay alguna manera de hacerlo sin atributos (como la configuración Xml o la configuración a través del código) sería preferible ya que la biblioteca específica donde esto está sucediendo hasta la fecha no necesita una dependencia de castle.



Puede usar el atributo Castle.Core.DoNotWireAttribute para evitar que una propiedad sea conectada por el contenedor IoC (esto es en el ensamblado Castle.Core, lo que significa que su biblioteca solo necesita tomar una dependencia del ensamblaje Castle.Core ligero - si, por ejemplo, desea utilizar el código sin un contenedor de inversión de control por completo, o en un contenedor de IoC diferente).

No creo que haya ninguna forma de evitar que se produzca el cableado en la configuración de Xml, pero sería razonablemente fácil agregar soporte para esto; si tuviera que hacer esto, probablemente:

  1. Introduzca algún tipo de atributo en la declaración de propiedad en el xml: <myprop wire = "false" />
  2. Heredar de PropertiesDependenciesModelInspector , anulando el método InspectProperties para aplicar alguna lógica adicional a la identificación de qué propiedades se deben agregar como dependencias al modelo de componentes (inspeccionando el modelo.Configuración para el par de atributo / valor wire = "false").
  3. Heredar de DefaultComponentModelBuilder e invalidar InitializeContributors para incluir su PropertiesDependenciesModelInspector de reemplazo - o simplemente eliminar el contribuidor de propiedades existente y agregar el suyo propio en tiempo de ejecución a través de los métodos AddContributor / RemoveContributor .
  4. Reemplace la instancia del servicio ComponentModelBuilder asignada al kernel de su contenedor.

Otro enfoque que podría funcionar para usted es simplemente eliminar manualmente las dependencias del modelo antes de que se soliciten instancias del servicio, es decir.

kernel.GetHandler (typeof (MyComponent)). ComponentModel.Dependencies.RemoveAll (d => d.DependencyKey == "PropertyThatShouldNotBeWired");

Sin embargo, YMMV con ese enfoque, especialmente si tiene servicios iniciables u otras instalaciones que pueden ejemplificar ansiosamente su componente después de que se haya registrado.




No sé qué versión de Castle estaban usando en ese momento, pero ninguna de las soluciones mencionadas funcionaba. Además, hay muchos enlaces muertos.

Con castle 3.1, aquí la solución que se me ocurrió (gracias a la excavación de algunos códigos fuente del castillo):

container.Register(Component.For(type) .LifestyleTransient() .Properties( propertyInfo => propertyInfo.PropertyType != typeof(MyOtherType)));

La función ''Propiedades'' agrega un filtro de propiedad utilizado por castle al construir el ComponentModel. En mi caso, se cumplirá con la dependencia de todas las propiedades excepto el tipo de propiedad ''MyOtherType''.