Si consiglia di trattare DbCommand
e i suoi amici come se fossero interfacce quando si utilizzano API di database. Per semplificare la generalizzazione di un'API su vari provider di database, DbCommand
raggiunge lo stesso valore di IDbCommand
-o, discutibilmente, meglio, perché include tecnologie più recenti come ad esempio await
in grado Task
*Async()
membri.
MS non può aggiungere nuovi metodi con nuove funzionalità a IDbCommand
. Se dovessero aggiungere un metodo a IDbCommand
, si tratta di una modifica irrisolta perché chiunque è libero di implementare tale interfaccia nel proprio codice e MS ha fatto molti sforzi per preservare la compatibilità con API e API nel framework. Se espandessero le interfacce in una versione di .net, il codice cliente che in precedenza funzionava avrebbe smesso di compilare e gli assembly esistenti che non venivano ricompilati avrebbero iniziato a riscontrare errori di runtime. Inoltre, non possono aggiungere i metodi appropriati *Async()
o Begin*()
tramite i metodi di estensione senza fare brutto casting a DbCommand
dietro le quinte (che è una cattiva pratica in sé, rompendo la sicurezza del tipo e introducendo inutilmente il cast dinamico di runtime).
D'altra parte, MS può aggiungere nuovi metodi virtuali a DbCommand
senza interrompere ABI. L'aggiunta di nuovi metodi a una classe base potrebbe essere considerata la rottura dell'API (tempo di compilazione, non altrettanto grave da rompere come runtime) perché se hai ereditato DbCommand
e hai aggiunto un membro con lo stesso nome, inizierai a ricevere l'avviso CS0108: 'member1' hides inherited member 'member2'. Use the new keyword if hiding was intended.) . Pertanto, DbCommand
può ottenere le nuove funzionalità con un impatto minimo sul consumo di codice che segue le buone pratiche (ad esempio, la maggior parte delle cose continuerà a funzionare finché non funziona contro il sistema di tipi e metodi di chiamata utilizzando qualcosa come myCommand.GetType().GetMethods()[3].Invoke(myCommand, …)
).
Una possibile strategia che MS avrebbe potuto utilizzare per supportare le persone a cui piacciono le interfacce sarebbe stata quella di introdurre nuove interfacce con nomi come IAsyncDbCommand
e di implementarle con DbCommand
. Non l'hanno fatto. Non so perché, ma probabilmente non lo hanno fatto perché aumenterebbe la complicazione e l'alternativa di consumare direttamente DbCommand
fornisce la maggior parte dei vantaggi per il consumo di interfacce con pochi aspetti negativi. Sì, sarebbe un lavoro con poco ritorno.
Non vedo 'IDbCommand.ExecuteScalarAsync()'. Cosa [documentazione] (https://msdn.microsoft.com/en-us/library/system.data.idbcommand (v = vs.110) .aspx) stai guardando? – binki
Oh, stavi dicendo ['SqlCommand.ExecuteScalarAsync()'] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalarasync%28v=vs.110%29. aspx). Io vedo. – binki
@binki o ['DbCommand.ExecuteScalarAsync()'] (https://msdn.microsoft.com/en-us/library/hh223677 (v = vs.110) .aspx), che non è abbastanza buono come averlo sull'interfaccia, ma supporta alcuni polimorfismi. – phoog