2010-10-10 26 views

risposta

5

Il solution proposed nell'elenco Unity discussione è di creare un contenitore bambino per richiesta, hanno quel contenitore figlio a creare il contesto EF come ContainerControlledLifetime, poi il contenitore figlio disposta all'estremità della richiesta. In questo modo non è necessario creare un LifetimeManager personalizzato.

Io non sono molto familiare con Unity ma il principio sarebbe qualcosa di simile:

Application_BeginRequest(...) 
{ 
    var childContainer = _container.CreateChildContainer(); 
    HttpContext.Items["container"] = childContainer; 
    childContainer.RegisterType<ObjectContext, MyContext> 
    (new ContainerControlledLifetimeManager()); 
} 

Application_EndRequest(...) 
{ 
    var container = HttpContext.Items["container"] as IUnityContainer 
    if(container != null) 
    container.Dispose(); 
} 
+0

Sì, ho visto questo modello, uno simile è stato proposto al mio scenario in StructureMap (http://stackoverflow.com/questions/3665336/iqueryable-repository-with-structuremap-ioc-how-do-i-implement- idisposable) con cui sei stato coinvolto. Alla fine, non ho avuto bisogno di farlo (per fortuna, non mi piace l'idea di creare DC in inizio/smaltimento). – RPM1984

+0

Da dove proviene _container? Penso di aver capito il concetto di Child Container, ma come faccio ad avere il genitore all'inizio della richiesta? Penso che questo possa aiutarmi in una situazione simile – RobD

+0

@RobD - Il _container di solito viene inizializzato da te durante App_Start (avvio iniziale del contenitore radice). – PHeiberg

1

Cosa intendi con l'iniezione? Intendi applicare il principio di inversione di dipendenza su di esso? Se sì, ti sei mai immaginato di cambiare il tuo contesto EF con un altro contesto che aderisce allo stesso contratto?

Per me si dovrebbe incapsulare contesto EF da qualche parte nel quadro, in modo che ogni richiesta viene EF DataContext. Applica DI sul tuo repository. In seguito i repository potrebbero avere diversi tipi di contesti e puoi cambiare repository tra loro.

6

Hai controllato fuori this ottimo blog sul DI con Unity e ASP.NET MVC?

Dovresti metterti sulla buona strada.

La risposta è sì , è possibile - e l'articolo vi spiega come.

In breve, si crea un HttpContextLifetimeManager per gestire la "scoping" degli oggetti. Il contenitore "memorizza nella cache" l'istanza nel contesto HTTP.

Questo è necessario perché i gestori di tempo di vita di default forniti da Unity non coprono Context HTTP scoping "off the shelf".

Naturalmente, un altro contenitore di DI (come StructureMap - che io uso), fare.

Here è un altro (più aggiornato) articolo sulla stessa cosa, con il "Nerdinner" come l'esempio.

+0

Se vedi il post che hai suggerito, lì sta facendo DI sul repository come suggerito e sta incapsulando DataContext in qualche altro posto. E poi all'interno del metodo di repository che l'autore sta recuperando DataContext da qualche postazione centrale. – Pradeep

+0

Ho visto il tuo suggerimento e sono d'accordo (anch'io utilizzo di repository/UoW). Tuttavia, questa non è una domanda sui modelli di progettazione - è una domanda sulla definizione del contesto per DI, che spero che la mia risposta aiuti. – RPM1984

+0

+1 - Buoni suggerimenti e articoli. Mi piace il modo in cui StructureMap è costruito in ambito HttpContext e questo riguarda il problema allo stesso modo. – PHeiberg

Problemi correlati