Domanda

Sto guardando un accesso al database di gestione della classe per un'applicazione MVC3/.NET.

La classe è statica e fornisce bei metodi di convenienza per le query DB comuni - ogni sorta di roba twiddly come "getColumnBValueForColumna ()", nonché query molto più complesse. È ben preso in considerazione/ottimizzata per la soluzione e il dominio indicato.

Vedere la classe come statica, tuttavia, ha innescato una memoria a metà dimenticata su come questa potrebbe essere una cattiva idea (forse nel contesto del multi-threading?) E non riesco a scuotere la sensazione.

È una buona idea mantenere statico questo tipo di classe o dovrei istanziare per ogni chiamata di database?

È stato utile?

Soluzione

È una buona idea mantenere statico questo tipo di classe o dovrei istanziare per ogni chiamata di database?

Se ti interessa cose come un accoppiamento debole tra gli strati della tua applicazione, la riusabilità di quegli strati, il test unitario in isolamento non dovresti fare nessuno dei precedenti. Dovresti lavorare con astrazioni.

Se non ti interessa queste cose, i metodi statici vanno bene. L'unica cosa da fare attenzione quando si lavora con metodi statici è progettarli in modo che lo siano rientrante e non dipendere da nessuno stato condiviso per essere sicuro. In tutti i casi, assicurarsi di smaltire correttamente tutte le risorse idisposibili come connessioni e comandi del database avvolgendole utilizzando le istruzioni.

Altri suggerimenti

È una buona idea mantenere statico questo tipo di classe o dovrei istanziare per ogni chiamata di database?

Queste non sono le tue uniche due opzioni.

La classe dovrebbe non Sii statico: rendendolo statico rinunci ad alcuni importanti vantaggi di programmazione orientata agli oggetti, pur guadagnando praticamente nulla.

Invece, un'istanza dovrebbe essere fornita ai controller tramite iniezione di dipendenza basata sul costruttore. Se la classe viene reincantata per ogni richiesta o se si finisce per usare un singleton viene quindi determinato dal codice di legame DI. Puoi cambiarlo alla goccia di un cappello.

Ecco un paio di vantaggi:

  1. Supponiamo che tu voglia testare unità il metodo che si basa su questa classe di accesso ai dati. Se stai usando un interfaccia di servizio iniettata Invece di chiamare direttamente un metodo statico, puoi creare un oggetto finto, dirlo come comportarsi e consentire al metodo che stai unità test di pensare che stia ottenendo dati reali quando in realtà lo stai solo dando da mangiare ai dati che desideri test.
  2. Supponi di voler voler memorizzare nella cache i risultati delle chiamate di accesso ai dati. È possibile iniettare una classe di memorizzazione nella cache che avvolge la classe effettiva, restituendo risultati memorizzati nella cache ove possibile e invocando i metodi di accesso ai dati reali quando i valori memorizzati nella cache non sono presenti. Niente di tutto ciò richiederebbe modifiche alla tua classe di accesso ai dati.

Potrei andare avanti. Le lezioni statiche uccidono la tua flessibilità e non hanno un vantaggio pratico il 99% delle volte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top