Pregunta

Al crear instancias de 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 bloquee.

¿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 ese sentido. Sin embargo, no puedo encontrarlo, así que avíseme el espacio de nombres / ensamblado apropiado.

Si hay alguna manera de hacer esto 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 no tiene que depender del castillo.

¿Fue útil?

Solución 2

Creé una instalación para ayudar con esto:

Otros consejos

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

No creo que haya ninguna forma de evitar que ocurra el cableado en la configuración 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 DefaultComponentMo a> y anule el InitializeContributors para incluir su PropertiesDependenciesModelInspector de reemplazo , o simplemente elimine el contribuyente de propiedades existente y agregue el suyo en tiempo de ejecución a través del AddContributor / métodos RemoveContributor .
  3. Reemplace la instancia de servicio ComponentModelBuilder asignada al núcleo de su contenedor.

Otro enfoque que podría funcionar para usted es eliminar manualmente las dependencias del modelo antes de solicitar cualquier instancia del servicio, es decir.

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

YMMV con ese enfoque, especialmente si tiene servicios iniciables u otras instalaciones que pueden estar instantaneando ansiosamente su componente después de que esté 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 del código 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 cuando construye el ComponentModel. En mi caso, todas las dependencias de propiedades serán satisfechas excepto el tipo de propiedad 'MyOtherType'.

Tal vez sea útil para alguien. En Windsor 4.1 hay un método PropertiesIgnore durante el registro.

Component.For<Role>().LifestyleTransient().PropertiesIgnore((model, propertyInfo) => true)

Esto se puede lograr con el siguiente código:

var container = new WindsorContainer();

// We don't want to inject properties, only ctors
var propInjector = container.Kernel.ComponentModelBuilder
                         .Contributors
                         .OfType<PropertiesDependenciesModelInspector>()
                         .Single();
container.Kernel.ComponentModelBuilder.RemoveContributor(propInjector);

Fuente Documentación de Castle Windsor

También publiqué esto en el foro de grupos de Google aquí: http : //groups.google.com/group/castle-project-devel/browse_thread/thread/43aa513817bd057a

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top