Questa domanda riguarda il contenitore di unità, ma suppongo che sia applicabile a qualsiasi contenitore di dipendenze.Iniezione di priorità: iniezione di oggetti parzialmente inizializzati
ho due classi con dipendenze circolari:
class FirstClass
{
[Dependency]
public SecondClass Second { get; set; }
}
class SecondClass
{
public readonly FirstClass First;
public SecondClass(FirstClass first)
{
First = first;
}
}
Tecnicamente è possibile istanziare e iniettare dipendenze per entrambi correttamente se trattarli come singletons:
var firstObj = new FirstClass();
var secondObj = new SecondClass(firstObj);
firstObj.Second = secondObj;
Quando provo a fare lo stesso con Unity, ottengo StackOverflowException:
var container = new UnityContainer();
container.RegisterType<FirstClass>(new ContainerControlledLifetimeManager());
container.RegisterType<SecondClass>(new ContainerControlledLifetimeManager());
var first = container.Resolve<FirstClass>(); // StackOverflowException here!
var second = container.Resolve<SecondClass>(); // StackOverflowException here too!
Capisco che Unity cerchi di proteggermi dall'usare oggetti parzialmente inizializzati, ma voglio avere questa protezione come un'opzione, non un obbligo.
Domanda: il comportamento corrente non è adatto?
non mi piace che l'unità non può istanziare le classi ma posso farlo manualmente. Dal collegamento MDSN fornito, nessuna delle seguenti condizioni è vera per il mio caso: -Oggetti generati tramite un'iniezione del costruttore che si richiamano nei parametri del costruttore -Oggetti generati tramite l'iniezione del costruttore dove un'istanza di una classe viene passata come parametro al proprio costruttore -Oggetti generati tramite l'iniezione di chiamata al metodo che fanno riferimento l'un l'altro -Oggetti generati tramite l'iniezione di proprietà (setter) che fanno riferimento l'un l'altro –
Il problema è che per alcuni momenti, "FirstClass" risiede senza l'oggetto di dipendenza, il che significa che non è veramente valido. Tutto ciò dipende fondamentalmente da ciò che i tuoi oggetti fanno quando sono costruiti, se la tua seconda classe cercherebbe di chiamare il primo, dove il primo si aspetta che l'oggetto dipendente sia disponibile, allora fallirebbe. Catene circolari come questa sono problematiche, per diverse ragioni, quindi dovresti cercare di evitare, se possibile. –
Preferirei ottenere NRE piuttosto che StackOverflowException, soprattutto tenendo conto che posso istanziare manualmente i miei oggetti. –