LINQ2SQL-t használunk ASP.NET projektben. A LINQ-hez tartozó DataContextet szerettük volna egy olyan változóban tárolni, ami több helyről is elérhető. Erre azért van szükség, mert ha tranzakcióban több műveletet hajtasz végre, akkor tanácsos csak egyetlen DataContext példányt használni (különben elosztott tranzakció indul, annak minden nyűgével). Egy dologra kell ilyenkor figyelni: a DataContext nem állapotmentes, úgyhogy nem szabad felhasználók között passzolgatni. Ebből következik, hogy nem lehet static...
Abból indultunk ki, hogy ASP.NET-ben minden kérést külön szál szolgál ki, tehát tegyük a DataContextet “szálanként statikussá” ([ThreadStatic]). Így elvileg minden kérésben egyedi lesz a [ThreadStatic] DataContextünk is. Ezzel nagyot lehet szívni, mert az ASP.NET újrahasználja a kiszolgáló szálakat, azaz egy kérés megörökölhetné egy korábbi független kérés [ThreadStatic] DataContextjét (lásd például ezt a bejegyzést).
Végül a legjobb megoldásnak az tűnt, hogy a DataContextet a HttpContext.Items-ben tároljuk el. Ez azért megfelelő, mert a Context.Items-ben tárolt értékek kérésenként egyediek, mégis az adott kérés során bárhonnan elérhetőek. A HttpContext.Items nem típusos tároló, így ajánlatos az ott tárolt DataContexthez típusos gettert készíteni:
public static DatabaseDataContext DatabaseDataContext
{
get
{
if( HttpContext.Current.Items[ "DatabaseDataContext" ] == null )
HttpContext.Current.Items[ "DatabaseDataContext" ] = new DatabaseDataContext();
return ( DatabaseDataContext ) HttpContext.Current.Items[ "DatabaseDataContext" ];
}
}