2011-11-16 14 views
5

tengo parte de un código que tiene dependencias que se ven de la siguiente manera:AutoFac: ¿Qué hace PropertyWiringFlags.AllowCircularDependencies?

public class MyPage : Page //ASPX WebForms page 
{ 
    public IPersonBl PersonBl { get; set; } 

} 

public class PersonBl : IPersonBl 
{ 

    public PersonBl(ISomeMagicBl magicBl){...} 

} 

public class SomeMagicBl : ISomeMagicBl 
{ 
    public IPersonBl PersonBl { get; set; } 

    public SomeMagicBl(/*Other dependencies*/) {...} 
} 

Mi configuración del módulo se ve de la siguiente manera

... 
builder.RegisterAssemblyTypes(ThisAssembly).Where(t => t.Name.EndsWith("BL")).AsImplementedInterfaces().PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies).InstancePerLifetimeScope(); 
... 

Como se puede ver, tengo dependencias circulares en mis clases que pude resolver usando el ..PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies)...

Mi pregunta: ¿Qué hace exactamente esta bandera entre bastidores para resolver estas dependencias circulares?

Respuesta

3

El indicador cambia el punto en el que se realiza la inyección de propiedad para el tipo desde el momento de la construcción hasta después de que se haya creado el resto del gráfico. Se basa en uno o más de los componentes del ciclo que tienen algún tipo de intercambio (singleton o por solicitud), incluso con el indicador, si todos los componentes son instancia por dependencia, entonces todavía existirá un tipo de ciclo.

Sin la marca, Autofac considera que todas las dependencias del componente, propiedades o no, son requisitos previos para permitir que cualquier otro componente obtenga una referencia al mismo. Como predeterminado, esto es más confiable.

+0

Perfecto, thx. Supuse que aplicaste ese tipo de estrategia, solo quería estar seguro :) – Juri

1

solo como referencia, otra buena forma de resolver una dependencia circular es tomar una dependencia en Func<T>, siempre que no acceda al func en el constructor.

+0

¿Puedes dar más detalles sobre esto? – Juri

+0

'Lazy ' funciona también. Las dependencias mutuas de constructores funcionan siempre que una de las dependencias use Lazy/Func como tipo de dependencia. –