Tengo el tipo más simple de dependencia circular en structuremap: la clase A se basa en la clase B en su constructor, y la clase B se basa en la clase A en su constructor. Para romper la dependencia, hice que la clase B tomara la clase A como propiedad, en lugar de un argumento de constructor, pero structuremap aún se queja.Dependencias circulares en StructureMap: ¿se pueden romper con la inyección de propiedades?
He visto las dependencias circulares rotas con este método en otros marcos DI. ¿Esto es un problema con Structuremap o estoy haciendo algo mal?
Editar: debería mencionar la propiedad de que la clase de B es un conjunto de instancias de la clase A, cableados así:
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
Solo para aclarar, quiero que la siguiente secuencia de eventos que se produzcan:
- Construir una instancia de B, "b"
- Construir una instancia de a, "a", la inyección de "b" en su constructor
- Set "b.ArrayOfA" a [ "a"]
Y quiero que todo esto suceda usando autowiring, si es posible ...
Edición 2: Aquí está un ejemplo simplificado que los usos explícita cableado hasta:
interface ILoader { }
interface ILoaderManager { }
class Loader : ILoader
{
public Loader(ILoaderManager lm) { }
}
class LoaderManager : ILoaderManager
{
public ILoader Loader { get; set; } // Was an array, but same circular dependency appears here
}
ObjectFactory.Configure
(
x =>
{
x.For<ILoader>.Singleton().Use<Loader>();
x.For<ILoaderManager>().Singleton().Use<LoaderManager>().OnCreation((c, a) => a.Loader = c.GetInstance<ILoader>());
}
);
Validación de las causas de configuración "bidireccional Dependencia problema detectado con requestedType: IocTest2.ILoader ..."
Hola Joshua - Acabo de probarlo y obtuve un "Problema de dependencia bidireccional" - ¿Creo que esto es un signo de una dependencia circular en StructureMap? ¿Es la construcción y configuración de un objeto por StructureMap efectivamente atómica, por lo que las referencias circulares no se pueden resolver? Parece poco probable, pero hasta ahora no he podido hacer que funcione ... – Andy
Dependencia bidireccional El problema indica una referencia circular. Sin embargo, la muestra de código que proporcioné FUNCIONará, ya que la instancia de B se crea antes de que se invoque a OnCreation lambda. Luego puede pasar esa instancia de B al constructor de A y luego establecer la propiedad de B en A. He probado el código anterior y funciona. Si aún tiene problemas de referencia circular, debe haber otras dependencias que no haya mencionado. –
Debo aclarar que al usar mi ejemplo de código, NO debe establecer ninguna política para que StructureMap realice la inyección setter en B. Está realizando manualmente la inyección setter en OnCreation lambda. –