Devo inserire il contesto EF per richiesta. C'è un modo per implementarlo?ASP.NET MVC iniettare per richiesta
risposta
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();
}
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
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
@RobD - Il _container di solito viene inizializzato da te durante App_Start (avvio iniziale del contenitore radice). – PHeiberg
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.
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.
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
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
+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
- 1. Asp.Net MVC ID univoco per richiesta
- 2. Come iniettare HttpContextBase utilizzando Autofac in ASP.NET MVC 4
- 3. Gestione richiesta asincrona in ASP.NET MVC
- 4. Richiesta di certificato client con Asp.net MVC
- 5. ASP.NET MVC ActionFilter - Determina se richiesta AJAX
- 6. Rileva una richiesta interrotta in ASP.NET MVC
- 7. MvcMailer SendAsync blocca una richiesta MVC ASP.NET?
- 8. ASP.Net MVC - Richiesta ciclo di vita
- 9. ASP.NET MVC 2 VirtualPathProvider GetFile ogni volta per ogni richiesta
- 10. Asp.Net MVC password per
- 11. acquisizione nome utente windows in asp.net richiesta mvc
- 12. come sapere se la richiesta è ajax in asp.net mvc?
- 13. ASP.NET MVC - Genera percorsi senza Http/Richiesta contesto
- 14. ASP.NET MVC ha ottenuto l'errore 405 sulla richiesta DELETE HTTP?
- 15. Asp.net MVC MiniProfiler "Richiesta non disponibile in questo contesto"
- 16. Ottenere la richiesta non elaborata in ASP.NET MVC
- 17. Modifica la proprietà del modello in post richiesta asp.net mvc
- 18. Iniezione dipendenza ASP.NET 5, iniettare con parametri
- 19. ASP.NET MVC IIS 7.5
- 20. ASP.Net MVC: RenderPartial per un file HTML statico
- 21. Scadenza sessione MVC ASP.NET
- 22. Asp.Net MVC 3 Editor per proprietà dinamiche
- 23. asp.net mvc FileStreamResult
- 24. ASP.NET MVC e AJAX
- 25. HttpContext.Items con ASP.NET MVC
- 26. Spring MVC vs ASP.NET (MVC?)
- 27. Come caricare e iniettare immagine di TinyMCE 4 con Asp.net MVC
- 28. Mock MVC - Aggiungi Richiesta parametri per testare
- 29. ASP.NET MVC vs. ASP.NET 4.0
- 30. ASP.NET MVC vs Spring MVC
Si sta utilizzando l'unità o in un altro contenitore CIO? – jgauffin
Sì, io uso Unity – SiberianGuy