Entity Framework rappresenta una scelta importante quando si sviluppano applicazioni ASP.NET, perchè la versione 4.0 introduce diverse novità interessanti per lo sviluppatore ASP.NET.
Quello che è importante, quando si vuole utilizzare un'applicazione ASP.NET che abbia un'architettura adeguata, è capire come gestire il ciclo di vita dell'Object Context. La scelta migliore, in tal senso, è quella di sfruttare un approccio che preveda un'istanza per-Request: consente di istanziare e tenere una copia dell'Object Context per richiesta, semplificando le operazioni su più entità all'interno di una richiesta e migliorando anche la scalabilità.
Questo scenario si implementa attraverso un HttpModule di ASP.NET, come ad esempio quello di seguito riportato:
public class WebContextModule : IHttpModule
{
public void Init(HttpApplication context)
{
// ad ogni richiesta creiamo un'istanza
context.BeginRequest += delegate (object sender, EventArgs e)
{
HttpContext.Current.Items[ConfigurationKeys.ConnectionString] =
new NorthwindEntities(Configuration.ConnectionString);
};
// alla fine di ogni richiesta, se attiva, la distruggiamo
context.EndRequest += delegate (object sender, EventArgs e)
{
var ctx = ((ObjectContext)
HttpContext.Current.Items[ConfigurationKeys.ConnectionString]);
if (ctx != null)
ctx.Dispose();
};
}
}Creare un'istanza ad ogni richiesta non aggiunge un overhead significativo, perchè la connessione è aperta fisicamente solo ed esclusivamente nel caso in cui un'operazione (come estrarre o aggiornare/inserire dati) dovesse richiederlo. E' importante, ovviamente, ricordarsi di registrare questo HttpModule all'interno del web.config.
Al fine di semplificare l'accesso all'Object Context, generalmente si preferisce creare una classe di contesto, singleton, che sia in grado di wrappare l'accesso allo stesso. Eccone un esempio:
public sealed class ApplicationContext : IApplicationContext
{
private static object _sync = new object();
private static volatile ApplicationContext _currentInstance;
public static ApplicationContext Current
{
get
{
if (_currentInstance == null)
{
lock (_sync)
{
if (_currentInstance == null)
_currentInstance = new ApplicationContext();
}
}
return _currentInstance;
}
}
public NorthwindEntities Context
{
get
{
if (HttpContext.Current.Items[ConfigurationKeys.ConnectionString] == null)
throw new InvalidOperationException(
"You must register the HttpModule to use per-Request impelementation.");
return ((NorthinwEntities)HttpContext.Current.Items[
ConfigurationKeys.ConnectionString]);
}
}
}Questa implementazione è molto semplice ed espone direttamente l'Object Context all'applicazione stessa. In caso si volesse disaccoppiare maggiormente Entity Framework dall'applicazione, si può optare per l'utilizzo del pattern Repository.
Approfondimenti
Le novità di Entity Framework 4.0https://www.linqitalia.com/articoli/entity-framework/novita-entity-framework-4.aspx
Utilizzo del pattern Repository con Entity Framework
http://blogs.aspitalia.com/cradle/post2627/Inside-ModelVirtualCasting-Sharp1-Introduzione-Repository.aspx
http://blogs.aspitalia.com/cradle/post2629/Inside-ModelVirtualCasting-Sharp2-Architettura-Interna-Repository.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Rendere le variabili read-only in una pipeline di Azure DevOps
Mischiare codice server side e client side in una query LINQ con Entity Framework
Gestire progetti .NET + React in .NET Aspire
Utilizzare WhenEach per processare i risultati di una lista di task
Modificare lo stile in una QuickGrid Blazor
Integrare un servizio esterno con .NET Aspire
Implementare il throttle in JavaScript
Creare espressioni riutilizzabili nelle query LINQ per Entity Framework
Gestire pubblicazione Kubernetes tramite .NET Aspire
Gestione ciclo di vita in .NET Aspire
Migrare applicazioni legacy nel cloud con Azure App Service Managed Instance
Effettuare la ricerca di testo nascosto in una pagina web con Javascript


