2013-01-19 6 views
5

C'è un modo, con EF6, per iniettare un creatore di istanza dell'oggetto personalizzato? Quello che devo fare è fornire istanze di entità a EF prima che avvenga la matrializzazione.materializzazione entità personalizzata

in pratica voglio essere in grado di definire la mia entità POCO con un costruttore non parametrico, in modo da poter usare l'aggreato DI, che alla fine viene mantenuto con EF.

ho che posso achive qualcosa di simile utilizzando l'evento ObjectMaterialized:

var oc = (this as IObjectContextAdapter).ObjectContext; 
oc.ObjectMaterialized += (s, e) => 
{ 
    //resolve and inject dependencies here using e.g. public properties 
}; 

ma mi piacerebbe davvero avere dipendenze dichiarati sul costruttore.

Qualche idea? Cheers, .m

+0

Se posso chiedere, quale dipendenza vuoi iniettare? –

+0

fondamentalmente servizi di dominio nei miei aggregati di modelli di dominio. Vengo dall'esperienza MongoDB e RavenDB in cui la permanenza di un modello di dominio sullo storage è molto semplice e l'immissione di dipendenze al momento della deserializzazione è davvero semplice, quindi mi piacerebbe capire se posso avere lo stesso supporto con EF6 (alfa2 attualmente). in pratica sto cercando di trovare un modo per dire a EF di usare il mio contenitore per risolvere le entità, o almeno di chiedermi come risolvere le entità :-) –

risposta

4

Utilizzando l'ObjectContext predefinito, non credo sia possibile aver guardato il codice EF. In definitiva gli oggetti vengono creati da ObjectContext.CreateObject. Questo fa una delle due cose: o chiama un costruttore predefinito, altrimenti, se la creazione del proxy è abilitata, crea il tipo di proxy pertinente. I tipi di proxy vengono utilizzati per il rilevamento avanzato delle modifiche e per le proprietà di caricamento lazy.

Tuttavia, lo ObjectContext.CreateObject è virtuale, pertanto è possibile sovrascriverlo in una classe derivata. Quella classe derivata verrebbe fornita con un riferimento al contenitore (o ambito di validità) e quindi, nella chiamata annullata CreateObject, verrebbe utilizzata per risolvere l'entità.

La domanda diventa, in che modo si specifica un tipo derivato come ObjectContext da utilizzare per un DbContext? Bene, c'è a constructor that takes an instance of the ObjectContext dovrebbe usare il DbContext.

È qui che la mia idea inizia ad andare un po 'fuori dai binari, poiché lo stesso ObjectContext ha bisogno del to be told sul modello che sta utilizzando nella stringa di connessione. Penso che questo potrebbe significare che un primo approccio al codice non funzionerebbe in quanto il modello è creato pigramente e quindi non disponibile prima della costruzione dello DbContext. Tuttavia, per un primo approccio del modello, forse potrebbe funzionare?

Problemi correlati