6

Ho scritto una classe che ha alcune dipendenze risolte dal contenitore di unità.Istanza registro unità e risoluzione

Dalla mia classe principale creo un nuovo oggetto

MyObject myObject = new MyObject(); 

mi registro con la mia Unità Container

UContainer.RegisterInstance<MyObject>(myObject, new ExternallyControlledLifetimeManager()); 

la creo il tipo che ha bisogno di questo come dipendenza

ConsumerObject consumer = new ConsumerObject(); 

il consumatore assomiglia a questo:

public class ConsumerObject 
{ 
    public ConsumberObject() 
    { 
     theObject = (MyObject)UContainer.Resolve(typeof(MyObject));  
    } 
} 

questo genera un'eccezione:

Risoluzione della dipendenza non è riuscita, type = "MyObject", name = "". Il messaggio di eccezione è: L'operazione di compilazione corrente (chiave di creazione della chiave di build [MyObject, null]) non è riuscita: il parametro pp non può essere risolto durante il tentativo di chiamare il costruttore MyObject (IPreferenceStorageProvider pp). (Strategia tipo BuildPlanStrategy, indice 3)

Perché la mia chiamata di risoluzione tenta di chiamare un altro contsructor sul tipo? Ho già creato e registrato l'istanza .. Ho anche provato come: theObject = UContainer.Resolve<MyObject>(); non sembra fare alcuna differenza ..

Grazie

risposta

1

Per quanto ne so l'Unità prova (per impostazione predefinita) per chiamare la costruttore con il maggior numero di parametri e tenta di risolvere ciascuno dei parametri dalle mappature. È necessario aggiungere il mapping per IPreferenceStorageProvider o rimuovere il costruttore che richiede questo parametro.

Se non si desidera che il parametro IPreferenceStorageProvider sia immesso dall'unità, potrebbe non essere affatto dichiarato come parametro costruttore. È possibile creare un'istanza hardcoded di questo oggetto nel costruttore predefinito.

+2

il problema è il "MyObject" non è il mio scopo .. Ha circa 15 costruttori .. Posso crearla, ma non ho alcun controllo sulla sua struttura .. Perché Unity sta cercando di rinnovarlo comunque? Ho creato un'istanza e l'ho registrata .. Ora è nel contenitore come un singleton, Non dovrebbe chiamare alcun costruttore .. ??? –

3

Non sono sicuro del perché tu stia vedendo il tuo comportamento. Ho appena creato un test che ha duplicato il tuo scenario e ha funzionato bene.

Hai provato qualcosa di simile,

public class ConsumerObject 
{ 
    public ConsumberObject(MyObject myObject) 
    { 
     theObject = myObject 
    } 
} 

e quindi utilizzando UContainer.Resolve<MyObject>()?

L'unica cosa che posso pensare è quando si accede a UContainer.RegisterInstance e poi a UContainer.Resolve si sta effettivamente accedendo a due contenitori diversi. Puoi mostrarci come stai dichiarando UContainer?

6

Penso che il problema sia l'utilizzo di ExternallyControlledLifetimeManager. In questo caso, il contenitore Unity contiene solo riferimenti deboli alla tua istanza. E quando provi a risolvere, la tua istanza è già stata raccolta. Ecco perché il LifeTimeManager predefinito per .RegisterInstance() è ContainerControlledLifeTimeManager. E il caso di Darrel Miller funziona, perché non è ancora GC-ed. Prova registrare l'istanza in questo modo:

UContainer.RegisterInstance<MyObject>(myObject); 
Problemi correlati