2010-01-20 11 views
8

Ho letto diverse altre domande su questo argomento (here, here e here), ma non ho ancora trovato una risposta eccellente. Ho sviluppato la mia giusta quota di livelli di accesso ai dati prima e personalmente preferisco utilizzare le classi di istanze invece delle classi statiche. Tuttavia, è più una preferenza personale (mi piace testare i miei oggetti di business, e questo approccio rende più semplice il DAL). Ho usato classi statiche per accedere al database in precedenza, ma mi sono sempre sentito un po 'insicuro nell'adeguatezza di un tale progetto (specialmente in un ambiente ASP.NET).Quali sono i pro/contro della scelta tra le classi di accesso ai dati statici e di istanza in un'app Web?

Qualcuno può fornire alcuni vantaggi/svantaggi per quanto riguarda questi due approcci allo sviluppo di classi di accesso ai dati con provider ADO.NET (senza ORM), in un'applicazione ASP.NET in particolare. Sentiti libero di suonare anche se hai ancora qualche consiglio di classe statico o di classe.

In particolare, le questioni che mi preoccupa sono:

  1. Threading & concorrenza
  2. scalabilità
  3. prestazioni
  4. Eventuali altre incognite

Grazie!

risposta

10

Gli approcci basati su statici in genere hanno uno, e solo uno, il vantaggio principale: sono facili da implementare. approcci basati

istanza vittoria per:

  1. Threading e la concorrenza - Non hai bisogno di alcuna tanto di sincronizzazione /, in modo da ottenere una maggiore velocità
  2. Scalabilità - questioni Come sopra
  3. Perf.- stessi problemi sopra
  4. Testabilità - Questo è molto più facile da testare, in quanto beffardo fuori un'istanza è facile, e testare classi statiche è fastidioso

approcci statici possono vincere su:

  1. memoria - Hai solo un'istanza, quindi impronta inferiore
  2. Consistenza/Condivisione - È facile mantenere una singola istanza coerente con se stessa.

In generale, ritengo che gli approcci basati sull'istanza siano superiori. Questo diventa più importante se si sta andando a salire oltre un singolo server, anche perché l'approccio statico si "spezzerà" non appena si inizia ad istallarlo su più macchine ...

+0

Penso che i pro superino di molto gli svantaggi, almeno secondo me. E per quanto riguarda il consumo di memoria, penso che sia probabilmente un inconveniente trascurabile nella maggior parte delle applicazioni. –

+0

@Kevin Babcock: personalmente cerco quasi sempre di usare un approccio basato su istanze. Se voglio/ho bisogno di statico, di solito vado a un singleton, poiché è più facile adattarsi a un multitone oa un approccio di istanza in seguito (dato che stai ancora lavorando con istanze ...) –

+0

@ReedCopsey, che ne pensi di una classe di utilità fare le pulizie di base, come la convalida dei dati? –

5

Il mio sentimento generale è: perché istanziare se non è necessario?

Uso classi statiche quando non ci sarà alcun uso per più istanze e non è necessario per i membri di istanza. Per quanto riguarda il DAL, il punto è che ce n'è solo uno. Perché istanziarlo se non ci sono valori in esso?

Vedere this link, che mostra che le chiamate al metodo statico sono più veloci delle chiamate al metodo della classe di istanza.

This link indica che un vantaggio dell'utilizzo di una classe statica è che il compilatore può verificare che nessun membro di istanza venga accidentalmente aggiunto.

This link indica che una classe statica può essere utilizzata come contenitore conveniente per insiemi di metodi che funzionano solo sui parametri di input e non devono ottenere o impostare alcun campo di istanza interno. Per un DAL, questo è esattamente quello che hai. Non vi è alcun motivo per creare campi di istanze interni e, quindi, nessuna ragione per creare un'istanza.

+0

C'è un sacco di valore nella creazione di istanze. Personalmente sento l'esatto opposto: vado solo statico se c'è una ragione convincente per il tipo/dati/metodo/ecc da trattare in modo statico. –

+0

Il mio sentimento generale è: perché renderlo statico quando non è necessario? – Amy

+0

@yoda e @Reed: sembra che la mia risposta sia errata. Secondo te, quali sono gli svantaggi delle classi statiche? –

0

Ho usato un sistema statico DAL per anni e sono d'accordo con le tue preoccupazioni. Il threading e la concorrenza sono i più impegnativi e nel mio caso memorizzo oggetti di connessione diversi nelle strutture statiche del thread. Ha dimostrato di essere molto scalabile e funziona bene, ancora di più ora che sto convertendo PropertyInfo in PropertyDescriptor che mi offre gli stessi benefici della riflessione con prestazioni migliori. Nel mio DAL ho semplicemente dovuto scrivere:

List<Entity> tableRows = SQL.Read(new SearchCriteria(), new Table()); 

Tutto depone le uova fuori dalla classe statica SQL, e che rende il mio codice molto più semplice.

+0

Che tipo di problemi di concorrenza hai incontrato con il tuo approccio? –

+0

Il modo in cui l'ho impostato Eseguo un oggetto di connessione per thread. Un problema di concorrenza che dovevo affrontare era quando si inserisce un nuovo oggetto, si ottiene la sua chiave primaria generata (da una sequenza o identità) e si popola il valore PK dell'oggetto - se non si fa attenzione si finisce per fare molti inserti e ottenere il risultato sbagliato sequenza che incasina la relazione FK. –

0

Per me il motivo principale è che non è necessario mantenere lo stato di tale oggetto DAL. Lo stato degli oggetti che usa non estende l'ambito del metodo che sono incorporati. In questo modo, perché manteresti più istanze di un oggetto, se sono tutte uguali?

Con le ultime versioni di ADO.NET, sembra essere consigliabile creare e distruggere la connessione al database nell'ambito della propria chiamata e lasciare che ConnectionPool si occupi comunque dell'intero problema di riusabilità della connessione.

Ancora con le ultime versioni di .NET Framework, TransactionScope (che sarebbe un motivo per gestire le connessioni da soli) passare al livello aziendale, che consente di unire più chiamate al DAL all'interno dello stesso ambito.

Quindi non riesco a vedere un caso limite per creare e distruggere (o memorizzare) le istanze del DAL.