Invest in people before investing in tools

Il blog di Matteo Baglini
posts - 118, comments - 95, trackbacks - 697

[Spring.NET #17] Spring.Core, Astrazione del Thread Local Storage

Cominciamo a scoprire il supporto che Spring.NET offre nel campo delle applicazioni asincrone. Nonostante la Base Class Library fornisca già un vasto insieme di classi per il Multi-threading il team di Spring.NET anche in questo caso ha introdotto una serie di classi che permettono di lavorare con una maggiore astrazione  ed in più offrono funzionalità assenti nelle versioni precedenti alla 2.0 del .NET Framework come il Semaphore . La prima parte che analizziamo riguarda il thread local storage, il quale cambia a seconda del tipo di applicazione che stiamo sviluppando, infatti se ci troviamo in un contesto Web useremo la classe System.Web.HttpContext.Current altrimenti utilizzeremo la classe System.Runtime.Remoting.Messaging.CallContext. Grazie all'interfaccia IThreadStorage possiamo effettuare le varie operazioni di scrittura, lettura ed eliminazione dal thread local storage in maniera polimorfica. Le implementazioni fornite sono:

  • CallContextStorage: la quale usa direttamente CallContext come storage.
  • HttpContextStorage: la quale usa direttamente HttpContext come storage.
  • HybridContextStorage: la quale sceglie automaticamente in base al tipo di applicazione quale storage utizzare.

Spring.NET fornisce anche la classe LogicalThreadContext la quale contiene un'istanza di IThreadStorage impostata per default a CallContextStorage, e modificabile tramite il metodo SetStorage. Come esempio creiamo una ConsoleApplication e scriviamo questo codice:

   1: class Program
   2: {
   3:     static void Main(string[] args)
   4:     {
   5:         object _value = "same_value";
   6:  
   7:         try
   8:         {
   9:             LogicalThreadContext.SetData("KEY", _value);
  10:             Console.WriteLine("DefaultContextStorage: " + LogicalThreadContext.GetData("KEY"));
  11:             LogicalThreadContext.FreeNamedDataSlot("KEY");
  12:         }
  13:         catch { Console.WriteLine("DefaultContextStorage non disponibile."); }
  14:  
  15:         try
  16:         {
  17:             LogicalThreadContext.SetStorage(new HybridContextStorage());
  18:             LogicalThreadContext.SetData("KEY", _value);
  19:             Console.WriteLine("HybridContextStorage: " + LogicalThreadContext.GetData("KEY"));
  20:             LogicalThreadContext.FreeNamedDataSlot("KEY");
  21:         }
  22:         catch { Console.WriteLine("HybridContextStorage non disponibile."); }
  23:  
  24:         try
  25:         {
  26:             LogicalThreadContext.SetStorage(new HttpContextStorage());
  27:             LogicalThreadContext.SetData("KEY", _value);
  28:             Console.WriteLine("HttpContextStorage: " + LogicalThreadContext.GetData("KEY"));
  29:             LogicalThreadContext.FreeNamedDataSlot("KEY");
  30:         }
  31:         catch { Console.WriteLine("HttpContextStorage non disponibile."); }
  32:  
  33:         Console.Read();
  34:     }
  35: }

semplicemente tramite la classe statica LogicalThreadContext usiamo i tre tipi diversi di context forniti da Spring.NET.

Technorati Tags:

Print | posted on martedì 23 ottobre 2007 01:09 | Filed Under [ .NET OpenSource Spring.NET ]

Powered by:
Powered By Subtext Powered By ASP.NET