6

Sto usando Linq per SQL per il mio DAL e ho sentito varie cose sull'utilizzo di metodi statici in un'applicazione web (per problemi di threading/concorrenza). Al momento, ho creato un test DAL, che sembra funzionare bene. Tuttavia, ci sono problemi con il modo in cui l'ho creato, dal momento che è statico?I metodi statici sono appropriati per un DAL Linq To SQL?

public static class TestDAL 
    { 


     public static bool GetUserAddress(string username) 
     { 
      testDBDataContext dbContext = new testDBDataContext(); 
      //Linq code goes here 

     } 


     public static void InsertUserNumber(int userID) 
     { 
      testDBDataContext dbContext = new testDBDataContext(); 
      //... 
      dbContext.UserDetails.InsertOnSubmit(nUser); 
      dbContext.SubmitChanges(); 

     } 

     //etc... All the methods are created in the same way 


    } 

Questo metodo è valido per un'applicazione Web o ci saranno problemi in un ambiente di produzione?

Grazie.

+0

Che cosa hai sentito di threading/concorrenza? – ScottE

+0

@ScottE: Non ho mai sentito nulla di grande dettaglio (in parte perché ho deciso di chiedere qui), ma ricordo di aver visto un post che afferma che potrebbero esserci problemi in cui i dati di un utente sono mescolati con anothers, dal momento che hanno avuto accesso i metodi DAL allo stesso tempo. – Skoder

risposta

5

Fintanto che i metodi statici non utilizzano nessuno stato condiviso (stato a livello di classe o altro stato globale), non causeranno alcun problema nell'esecuzione in un ambiente con multithreading. Ogni invocazione di metodo statico creerà copie delle proprie variabili locali.

+0

@Jeff: Grazie per la risposta. No, i metodi sono praticamente autosufficienti in tal senso. Ricordo solo di aver visto alcuni articoli di L2S, e sembravano avere una classe non statica con una sola istanza di DataContext (che è usata dagli altri metodi). Volevo solo assicurarmi che il metodo che ho, con i nuovi DataContex creati per metodo, non sarebbe problematico. – Skoder

+0

Scusa, ho dimenticato di chiedere. Se un metodo richiama un altro metodo, conterebbe che le variabili siano condivise (in cui entrambi i metodi possono anche essere chiamati individualmente)? Oppure ogni metodo creerebbe comunque la propria variabile locale? – Skoder

+1

I metodi statici possono invocare l'un l'altro senza causare problemi di threading, purché entrambi i metodi utilizzino solo variabili locali (e parametri del metodo). Per informazioni su cosa è in gioco quando si esegue in un ambiente con multithreading (come un'app Web) e cosa può andare storto, consiglio di leggere "Threading in C#" di Joseph Albahari (all'indirizzo http: //www.albahari. com/threading /) e "Multi-threading in .NET" di Jon Skeet (http://www.yoda.arachsys.com/csharp/threads/). –

3

Personalmente eviterei i metodi statici in quanto renderà questo codice molto più difficile da testare. Non sarai in grado di prendere facilmente in giro il DAL durante il test del codice che lo utilizza. Si noti che questo non è univoco per LINQ o livelli di accesso ai dati, è solo una funzione del codice che è un metodo di classe piuttosto che un metodo di istanza.

+0

@ tvanfosson: Grazie per il consiglio. Questo progetto attuale è piuttosto piccolo, quindi il test non è un fattore decisivo. Tuttavia, prenderò sicuramente in considerazione i metodi di istanza quando si lavora su un progetto più ampio. – Skoder

2

Dallo snippet che hai fornito non è molto chiaro cosa facciano i vari metodi. Il modo in cui lo vedo, finché usi le variabili locali, è sicuro.

+0

@Darin: Grazie per la risposta. Gli altri metodi sono piuttosto generici, ma nessuno di essi condivide alcuna variabile globale. – Skoder