Owin è il nuovo open source standard per sviluppare e ospitare applicazioni web ed ha apportato sensibili miglioramenti allo sviluppo web sia in termini di flessibilità che di produttività dello sviluppatore. Svincola le applicazioni ASP.NET da IIS, consentendo che i siti siano ospitatati su vari server. Inoltre permette di raggruppare e concatenare il middleware in una pipeline, in modo che il codice dell’infrastruttura possa essere scomposto in moduli separati e riutilizzabili. Grazie a Owin, ora è molto più semplice assemblare una web app che soddisfi le esigenze specifiche di un cliente e sia eseguibile nell’ambiente scelto.
Unity consente di collegare i cicli di vita dell’oggetto a una singola request, utilizzando ‘PerRequestLifetimeManager’ nella registrazione dei tipi:
Tuttavia, è necessario un codice cleanup separato. Normalmente lo sviluppatore registrerebbe il Modulo Http ‘UnityPerRequestHttpModule’. Questa opzione non è più possibile con Owin. I Moduli Http sono un tool di IIS (Internet Information Services), che è il dettaglio specifico della piattaforma da cui l’applicazione è stata svincolata.
L’opzione più semplice è quella di omettere il cleanup. Ho creato un sito web semplice esemplificativo (disponibile all’indirizzo https://github.com/NathanLBCooper/OwinPerRequestUnityMiddleware). Lo screenshot mostra il sito in esecuzione con l’uso sprovveduto di PerRequestLifetimeManager, senza il modulo http o il codice di cleanup. Il numero sulla colonna a destra indica quanti oggetti sono in attesa di eliminazione.
Qui c’è un grosso problema. Mentre il garbage collector alla fine si occuperà di questi 40 oggetti, al momento sono tutti inutilizzati. L’oggetto dietro le quinte qui è estremamente semplice, ma questa falla potrebbe causare seri problemi in un’applicazione reale. Fortunatamente c’è una soluzione semplice, ossia sfruttare il potente middleware di Owin.
La prima cosa che occorre fare è scrivere la procedura di cleanup. Ecco alcune linee di codice semplici per estrarre dal container gli oggetti per-request ed eliminarli:
La procedura di cleanup deve entrare nella pipeline di Owin, in modo da essere eseguita dopo ogni request. Sotto è riportato un diagramma che mostra cosa succede quando viene invocato il middleware. Forma una catena di esecuzione, la request viene inviata all’applicazione e viene restituita la response.
Il codice cleanup deve intervenire dopo che la request è stata trattata, dato che la response si propaga. Qui è riportata un’implementazione di quanto detto:
Il middleware ora è completo. Per poterlo utilizzare nell’applicazione, dobbiamo registrarlo nella Owin Startup class. Prima di fare questo, è meglio che scriviamo un metodo di estensione che richiamiamo per registrare il middleware. Penso che sia utile tenere traccia del middleware registrato aggiungendo una key a IAppBuilder.Properties, che sarà una responsabilità di questo metodo.
Ora, ecco come richiamare questo metodo dalla Startup class:
Ecco fatto. Il middleware è a posto e ora gli oggetti sono stati eliminati correttamente. L’applicazione web esemplificativa ora mostrerà un oggetto non ancora eliminato, che è esattamente il numero necessario per gestire la request. L’applicazione può continuare ad utilizzare sia Unity che Owin, senza spiacevoli perdite di risorse.
Il middleware è anche disponibile come pacchetto NuGet al link: https://www.nuget.org/packages/RequestLifetimeMiddleware/ together with instructions for installation.
Tutto il codice sorgente è disponibile al link: https://github.com/NathanLBCooper/OwinPerRequestUnityMiddleware.