2012-05-26 25 views
5

Attualmente sto sviluppando un API Web REST MV C# e sto cercando di scegliere tra una delle due possibilità per il nostro progetto.C# Metodo statico contro istanza oggetto

Senza entrare troppo nel nostro progetto, intendiamo avere una classe per l'accesso ai dati, che chiameremo DataSource. Ogni DataSource dovrà eseguire blocchi di logica piccoli e contenuti per creare correttamente una risposta appropriata. A causa del desiderio di poter caricare il codice in futuro, non vogliamo semplicemente avere queste funzioni su DataSource, ma vorremmo che fossero fornite da altri gruppi. Abbiamo una dimostrazione di questo concetto implementata e, finora, così buona.

Quello che sto cercando di decidere è scrivere una classe statica con una singola funzione statica ExecuteQuery o scrivere un metodo factory per creare istanze di queste classi, che hanno un metodo di istanza chiamato ExecuteQuery.

Quali sono le considerazioni sulle prestazioni tra la creazione di più oggetti di breve durata ogni richiesta, o la chiamata di metodi statici?

Intuitivamente, i metodi statici sarebbero più veloci, ma mi aspetto già che mi imbatterò in un po 'di mal di testa chiamandoli attraverso la riflessione (per supportare il requisito di codice caricato a caldo).

Se non c'è un'enorme penalità per oggetti di breve durata, allora potrebbero vincere solo con la semplicità.

informazioni relative ai nostri carichi aspetterebbe:

  • I tempi di risposta nel 300ms - gamma 800ms
  • carico medio di circa 2000 clienti web
  • carico di picco di circa 4000 clienti
  • Clienti che fanno query ogni 2 - 5 secondi
  • Frequenza di picco del client di 1 query al secondo

Inoltre, ogni DataSource creerebbe un massimo di 8, una media di 3 di queste istanze.

+0

Probabilmente il tuo intento di utilizzare il riflesso causerà un impatto maggiore sulle prestazioni rispetto all'utilizzo dell'istanza statica. Come altri hanno commentato, dovresti scegliere il modulo che ha il maggior senso di _design_. In alternativa, poiché hai alcune metriche previste, potresti prendere in giro un'implementazione statica/di istanza e avere un'idea del sovraccarico che dovrai affrontare. –

risposta

1

Utilizzare una classe statica, che delega le chiamate alle classi di implementazione.

Queste classi di implementazione dovrebbero implementare un'interfaccia comune, che consentirà di richiamare i metodi su di essi senza necessità di riflessione. E, naturalmente, i metodi statici non possono implementare metodi di interfaccia. Le implementazioni dell'interfaccia devono essere istanze, è necessario un qualche tipo di fabbrica per istanziarle. Se vivono in assemblee esterne, consiglio vivamente di dare un'occhiata al Managed Extensibility Framework (MEF), vedere http://msdn.microsoft.com/en-us/library/dd460648.aspx.

Quali sono le considerazioni sulle prestazioni tra la creazione di più oggetti di breve durata ogni richiesta, o la chiamata di metodi statici? Dato che questi metodi faranno l'accesso ai dati, le implicazioni sulle prestazioni sono totalmente e completamente trascurabili.

Se si utilizza MEF, il framework creerà per voi istanze simil-singleton.

Se si esegue il proprio ruolo e si desidera rimuovere la necessità di creare più volte questi oggetti, è possibile implementare il modello Singleton su di essi.

+0

Avevo discusso dell'uso del singleton Patter, ma non avevo ancora preso nessuna decisione. Penso che MEF sarà esattamente quello che sto cercando. Grazie! –

0

La decisione principale dovrebbe essere "questo oggetto ha lo stato?"

Se "No", quindi con tutti i mezzi, renderlo un metodo statico.

IMHO .. PSM

+0

Sfortunatamente, i requisiti per tutti gli oggetti possibili non sono ancora disponibili, quindi mentre non penso che abbiano lo stato, non posso essere sicuro al 100% in questa fase. –

1

presumo ogni DataSource esempio farà una nuova connessione al database. Se è così, allora avrebbe senso avere solo un'istanza. L'unico modo per scoprire se "è una penalità enorme" è quello di creare un modello di entrambe le soluzioni e il profilo e vedere se l'impatto è significativo o meno.

  • Dal momento che non sembra avere molti client contemporaneamente, quindi questo si trova anche con il modello Singleton.
  • Non molte query simultanee (principalmente a causa dell'istruzione precedente).
  • Si dispone di una specifica definita del tempo di risposta.

L'unico argomento che posso fare per il modello Factory è per "semplicità". Se il progetto è veramente sensibile al fattore tempo, suppongo che tu non abbia altra scelta. Ma se vuoi davvero prestazioni, vai con Singleton.

1

Utilizzare MEF. Non c'è bisogno di inventare il proprio framework di plugin. Vi guiderà verso i metodi di istanza esposti tramite interfacce. Non è raro creare oggetti per richiesta ... il framework MVC lo fa dappertutto. Le istanze per richiesta sono particolarmente utili per gli scenari di accesso ai dati, in modo che tu possa supportare cose come transazioni/rollback in un modo in cui l'esperienza di un utente non ha alcun impatto sugli altri utenti fino a quando non lo fai esplicitamente. Utilizzare la cache di risposta laddove appropriato se perf è un problema.

+0

Questo è un ottimo punto, non mi era venuto in mente che MVC deve creare più oggetti per ogni richiesta. Cercherò sicuramente MEF, come è stato menzionato due volte e, a prima vista, sembra esattamente quello che voglio. –

Problemi correlati