Я рекомендую обращаться с DbCommand
и его друзьями, как если бы они были интерфейсами при использовании API баз данных.Ради обобщения API между различными поставщиками баз данных, DbCommand
достигает так же хорошо, как и IDbCommand
- или, возможно, лучше, потому что он включает в себя новые технологии, такие как надлежащие await
способные Task
*Async()
члены.
MS не может добавлять новые методы с новыми функциями в IDbCommand
.Если бы они добавили метод к IDbCommand
, это было бы серьезным изменением, потому что любой может свободно реализовывать этот интерфейс в своем коде, а MS приложила немало усилий для сохранения совместимости ABI и API в рамках.Если бы они расширили интерфейсы в выпуске .net, код клиента, который ранее работал, прекратил бы компиляцию, и существующие сборки, которые не были перекомпилированы, начали бы сталкиваться с ошибками во время выполнения.Кроме того, они не могут добавлять надлежащие методы *Async()
или Begin*()
через методы расширения, не выполняя уродливое приведение к DbCommand
за кулисами (что само по себе является плохой практикой, нарушая безопасность типов и излишне вводя динамическое приведение во время выполнения).
С другой стороны, MS может добавлять новые виртуальные методы в DbCommand
, не нарушая ABI.Добавление новых методов в базовый класс может рассматриваться как нарушение API (время компиляции, не так плохо, как разрыв во время выполнения), потому что если вы унаследовали DbCommand
и добавили элемент с тем же именем, вы начнете получать предупреждение CS0108: 'member1' скрывает унаследованный член 'member2'.Используйте новое ключевое слово, если скрытие было предназначено. ).Таким образом, DbCommand
может получить новые функции с минимальным влиянием на потребление кода, что следует передовой практике (например, большинство вещей будет работать до тех пор, пока они не будут работать с системой типов и вызывать методы, использующие что-то вроде myCommand.GetType().GetMethods()[3].Invoke(myCommand, …)
).
Возможной стратегией, которую MS могла бы использовать для поддержки людей, которым нравятся интерфейсы, было бы введение новых интерфейсов с именами, такими как IAsyncDbCommand
, и DbCommand
для их реализации.Они этого не сделали.Я не знаю почему, но они, вероятно, не сделали этого, потому что это увеличило бы сложность, и альтернатива непосредственного потребления DbCommand
обеспечивает большую часть преимуществ для потребления интерфейсов с небольшим количеством недостатков.То есть это будет работать с небольшим возвратом.