2011-11-16 24 views
5

Ho parte di un codice che ha dipendenze che apparire come segue:AutoFac: cosa fa 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*/) {...} 
} 

La mia configurazione del modulo si presenta come segue

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

Come si può vedere, ho dipendenze circolari nelle mie classi che sono stato in grado di risolvere utilizzando il ..PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies)...

La mia domanda: Che cosa fa esattamente questa bandiera dietro le quinte per risolvere queste dipendenze circolari ??

risposta

3

Il flag cambia il punto in cui l'iniezione struttura è fatto per il tipo di volta costruzione a dopo la creazione del resto del grafico. Si basa su uno o più componenti del ciclo che hanno una sorta di condivisione (singleton o per-request) - anche con il flag, se tutti i componenti sono istanza per dipendenza, allora esiste ancora un tipo di ciclo.

Senza il flag, Autofac considera tutte le dipendenze del componente, proprietà o non, essere prerequisiti per lasciare che qualsiasi altro componente ottenere un riferimento ad esso. Di default questo è più affidabile.

+0

Perfetto, thx. Immaginavo che applicassi questo tipo di strategia, volevo solo essere sicuro :) – Juri

1

solo per riferimento, un altro buon modo per risolvere una dipendenza circolare è prendere una dipendenza su Func<T>, a condizione che non si acceda al func nel costruttore.

+0

Puoi approfondire questo? – Juri

+0

'Lazy ' funziona pure. Le mutue dipendenze dei costruttori funzionano fintanto che una delle dipendenze utilizza Lazy/Func come tipo di dipendenza. –